2014-11-30 15 views
0

WinForms, C#, AxMsTscNotSafeForScripting 도구를 사용하여 약간의 클라이언트를 작성하고 VM에서 Win + R을 전송해야합니다 (예, 알고 있습니다. 원격으로 앱을 시작하는 방법이 있습니다. RunDialog없이,하지만 내가 필요). InputSimulator이라는 이름의 멋진 lib가 금새 발견되어 주 머신에서 모든 것을 올바르게 시뮬레이트하지만 VM에는 아무런 영향을 미치지 않습니다.알려진 모든 방법으로 RDP를 통해 입력을 보내는 데 문제가 발생했습니다.

실제로는 string을 메모장에 보낼 수 있지만 VirtualKeyCodes를 처리하면 아무 일도 일어나지 않습니다. 드릴링 후 조금 더 깊이 void PressKey(char ch, bool press) void KeyDown(ushort scanCode) void KeyUp(ushort scanCode)WindowsAPI.SendInput의 사용법을 발견했습니다.

PressKey은 VM에서 작동하지만, 내가 필요한 KeyDownKeyUp은 올바르지 않습니다. 예를 들어 81은 "Q"에 대한 ScanCode이지만 "." 메모장에서 82는 "R"에 대한 것이지만 "0"을 얻고 나는 91로 아무 것도 얻지 못합니다. 그것은 Windows 키입니다. 키보드로 키를 누르면 모든 것이 작동하므로 KeyPreview, EnableWindowsKey 등의 설정에 문제가 없습니다. 두 시스템 모두 Oracle VM VirtualBox 인 Win7입니다.

내 방식이 절망적이라 할지라도 Win + R을 프로그래밍 방식으로 VM에 전송하는 또 다른 방법은 무엇입니까? 도움말 크게 감사드립니다!

+0

질문의 길이 *가 문제가 아니며, 조직이 완전히 부족합니다. 편집하십시오. 코드를 올바르게 표시하려면 코드 주위에 역 따옴표 ('')를 사용하는 것이 좋습니다. –

+0

@BenVoigt 희망이 지금은 더 좋아 보인다. 내 첫 번째 질문이다. 조언을 주셔서 감사합니다. 가능한 경우 답변을 드릴 수있게되어 기쁩니다. – Amateur

+0

놀랍도록 * 더 좋습니다. –

답변

0

PressKey이 작동하는 이유는 사용자가 기대하는 ASCII char을 제공하기 때문입니다.

KeyDownKeyUp이 작동하지 않는 이유는 you're still supplying an ASCII value이지만 이러한 것들은 스캔 코드를 예상합니다. 스캔 코드는 ASCII 코드와 다릅니다. 82 (0x52)가 the common scancode tables 인 경우 "R"이 아닙니다. 표 2와 3 모두에서 NumPad 0이며 관찰 된 동작과 일치합니다.

ASCII 코드 또는 가상 키 코드를 스캔 코드로 변환하려면 MapVirtualKey(Ex)을 사용해야합니다.

"R"은 표 2와 3에서 모두 0x13으로 보이지만 WinKey는 모든 테이블에 다른 코드가 있으므로 값을 하드 코딩하지 말고 실행시 MapVirtualKeyEx을 사용해서는 안됩니다.

+0

대단히 감사합니다! 이렇게 이상한 나는 대신에 VK 테이블을 사용했다. 그러나 나는 여전히 잘못된 것을하고 있으며 여전히 winkey가 VM에 도착하지 않았다. – Amateur

+0

@Amateur :'MapVirtualKeyEx'는 Windows 키의 스캔 코드를 알려 줬을 까? –

+0

It 's 91 @BenVoigt – Amateur