0

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

实际上,它可以将整个发送string到记事本中,但是当它处理 VirtualKeyCodes 时,什么也没有发生。在深入研究谷歌之后,我发现了WindowsAPI.SendInputwith methods 的用法 void PressKey(char ch, bool press) void KeyDown(ushort scanCode) void KeyUp(ushort scanCode)

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

即使我的方式是无望的,还有什么其他方法可以将 Win+R 以编程方式发送到 VM?帮助将不胜感激!

4

1 回答 1

0

起作用的原因PressKey是您提供了char它所期望的 ASCII 。

原因KeyDown并且KeyUp不起作用是您仍在提供 ASCII 值,但这些需要扫描码。扫描码与 ASCII 码不同。82 (0x52) 不在"R"任何常见的扫描码表中——在表 2 和表 3 中它都是 NumPad 0,这与您观察到的行为一致。

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

看起来"R"是 0x13(在表 2 和表 3 中),但 WinKey 在每个表中都有不同的代码,因此您不应该硬编码该值,而是在运行时使用MapVirtualKeyEx.

于 2014-12-01T15:21:18.787 回答