我使用PostMessage来模拟后台程序中的击键。除了需要在物理键盘上移位的字符外,它工作正常。我如何模拟班次? “
我使用的代码大致是:
VK vk = VkKeyScanEx (c, GetKeyboardLayout (0));
AttachThreadInput (_attachedThredId, _attachedProcessId, true);
PostMessage (_window, WM_KEYDOWN, vk.key, 0x1);
PostMessage (_window, WM_KEYUP, vk.key, 0xC0010001);
AttachThreadInput (_attachedThredId, _attachedProcessId, false);
我该如何处理VK的扩展部分?
修改
我正在尝试创建一个屏幕键盘。屏幕键盘上的每个按钮都模拟一系列击键。接收器是一个旧程序,根据执行的键盘顺序执行不同的任务。 键盘序列如下
其中{ESC}模拟按下Esc键,NN是十六进制值,§/½让程序听。
通常我们有专门的物理键盘来控制程序,但它们很贵。因此,在我们并不总是拥有物理键盘的测试环境中,我们必须手动输入这些代码
答案 0 :(得分:5)
你必须妥协:
如果你想模拟键盘输入,那么你必须使用SendInput
,这意味着受到当前焦点的窗口的支配。 SendInput
就像敲击物理键盘上的按键一样。使用键盘将键击发送到特定窗口的唯一方法是ALT+TAB
到右侧窗口。
如果您想将击键发送到特定窗口,那么您会产生一种时髦的行为:
WM_KEYDOWN
/ WM_KEYUP
消息不是检测键盘输入的唯一方法。例如,还有键盘状态(GetKeyboardState()
),您将难以模拟。这很可能是您遇到的情况。没有办法解决这些副作用;这是做阴暗事物的结果。
针对您的目的的解决方案,因为您定位的是单个特定应用,可能会将PostMessage
与SetKeyboardState结合使用来模拟键盘状态,包括移位位置。
答案 1 :(得分:2)
好吧,我认为你在这里搞得一团糟,PostMessage()
因not working well with shift states而臭名昭着,钩子也不会被调用。 Microsoft建议使用SendInput()
,我也是。我建议你发布一个新问题,或者更新这个问题,详细说明你想要实现的目标,也许我们可以更好地推荐一个不同的解决方案。 / p>
至于扩展部分,它根本与此无关,对你没有帮助。
您可以尝试的内容,是发送WM_KEYDOWN消息,其中显示已按下shift键,然后在发送WM_KEYUP转移消息之前发送带有所需密钥的另一条消息。我怀疑这会奏效,但你可以随时尝试。
答案 2 :(得分:1)
我个人会为此目的使用SendKey.Send()。