Trouble with sending input via RDP by all known ways

545 views Asked by At

I write a little client using WinForms, C#, AxMsTscNotSafeForScripting tool, and I need to send Win+R on the VM(yes, I know, there's a way to launch app remotely without RunDialog, but I need to). I quickly found nice lib named InputSimulator, it simulates everything correctly on my main machine, but no effect on VM.

Actually, it can send the whole string into notepad, but when it deals with VirtualKeyCodes, nothing happens. After drilling Google a bit deeper I found usage of WindowsAPI.SendInput with methods void PressKey(char ch, bool press) void KeyDown(ushort scanCode) void KeyUp(ushort scanCode).

PressKey is working with VM, but KeyDown and KeyUp, which I need, are incorrect. For example, 81 is ScanCode for "Q", but it prints "." in notepad, 82 is for "R", but I get "0" and I get nothing at all with 91, that's for Windows key. If I press key with a keyboard, everything works, so problem isn't in KeyPreview, EnableWindowsKey, etc settings Both systems are Win7, Oracle VM VirtualBox.

Even if my way is hopeless, what are another ways to send Win+R programmly to VM? Help will be greatly appreciated!

1

There are 1 answers

3
Ben Voigt On

The reason PressKey is working is that you're supplying an ASCII char, which it expects.

The reason KeyDown and KeyUp are not working is that you're still supplying an ASCII value, but these expect a scan code. Scan codes are not the same as ASCII codes. 82 (0x52) is not "R" in any of the common scancode tables -- in both Table 2 and 3 it is NumPad 0, which is consistent with your observed behavior.

You need to use MapVirtualKey(Ex) to translate your ASCII code or virtual key code into a scan code.

It looks like "R" is 0x13 (in both Table 2 and 3), but the WinKey has a different code in every table, so you should not hard-code the value but get it at runtime using MapVirtualKeyEx.