通过所有已知方式通过RDP发送输入的麻烦

时间:2014-11-30 23:41:51

标签: c# rdp mstsc

我使用WinForms,C#,AxMsTscNotSafeForScripting工具编写了一个小客户端,我需要在VM上发送Win + R(是的,我知道,有一种方法可以在没有RunDialog的情况下远程启动应用程序,但我需要)。 我很快发现名为InputSimulator的好lib,它在我的主机上正确模拟了所有内容,但对VM没有影响。

实际上,它可以将整个string发送到记事本,但是当它处理VirtualKeyCodes时,没有任何反应。 在深入挖掘Google之后,我发现WindowsAPI.SendInput使用了方法 void PressKey(char ch, bool press) void KeyDown(ushort scanCode) void KeyUp(ushort scanCode)

PressKey正在使用VM,但我需要的KeyDownKeyUp不正确。例如,81是ScanCode的“Q”,但它打印“。”。在记事本中,82代表“R”,但是我得到“0”而我得到的一切都没有91,那是Windows密钥。 如果我用键盘按键,一切正常,所以问题不在KeyPreview,EnableWindowsKey等设置中 两个系统都是Win7,Oracle VM VirtualBox。

即使我的方式毫无希望,将Win + R程序发送到VM的另一种方法是什么?非常感谢帮助!

1 个答案:

答案 0 :(得分:0)

PressKey正在运作的原因是您正在提供它所期望的ASCII char

KeyDownKeyUp不起作用的原因是you're still supplying an ASCII value,但这些预计需要扫描代码。扫描码与ASCII码不同。在the common scancode tables的任何一个中,82(0x52)不是"R" - 在表2和表3中都是NumPad 0,这与您观察到的行为一致。

您需要使用MapVirtualKey(Ex)将您的ASCII代码或虚拟密钥代码转换为扫描代码。

看起来"R"是0x13(在表2和表3中),但是WinKey在每个表中都有不同的代码,因此您不应该对该值进行硬编码,而是使用{{}在运行时获取它。 1}}。