我使用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,但我需要的KeyDown
和KeyUp
不正确。例如,81是ScanCode的“Q”,但它打印“。”。在记事本中,82代表“R”,但是我得到“0”而我得到的一切都没有91,那是Windows密钥。
如果我用键盘按键,一切正常,所以问题不在KeyPreview,EnableWindowsKey等设置中
两个系统都是Win7,Oracle VM VirtualBox。
即使我的方式毫无希望,将Win + R程序发送到VM的另一种方法是什么?非常感谢帮助!
答案 0 :(得分:0)
PressKey
正在运作的原因是您正在提供它所期望的ASCII char
。
KeyDown
和KeyUp
不起作用的原因是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}}。