创建屏幕键盘
我使用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的扩展部分
编辑
我试图创建一个屏幕上的键盘? 。屏幕键盘上的每个按钮都可以模拟一系列按键。接收机是一个旧程序,根据所执行的键盘顺序执行不同的任务。 键盘序列i S作为如下
- {ESC} {NN ESC} NN
- {ESC} NN
- ½NN
- §NN
其中{} ESC模拟按下Esc键,NN是十六进制值,§/½让程序听。
通常我们有特殊的物理键盘来控制程序,但它们很贵。因此,在我们并不总是拥有物理键盘的测试环境中,我们必须手动输入这些代码。
你必须妥协:
如果你想模拟键盘输入,则必须使用SendInput
,这意味着处于哪个窗口的当前具有焦点的怜悯。 SendInput
就像打在你的物理键盘上的键。您可以使用键盘将击键发送到特定窗口的唯一方法是在右侧窗口输入ALT+TAB
。
如果要发送键击到特定的窗口,则招致时髦的行为:
- 应用程序处理的输入不同。简单的消息并不是检测键盘输入的唯一方法。例如,还有键盘状态(
GetKeyboardState()
),您将有更难模拟的时间。这很可能是你正在经历的。 - 应用程序可能依赖接收键盘输入消息时有焦点的标准行为。通过向这些应用程序发布消息,您可以调用可能使其崩溃的奇怪乱序行为。
- 现在系统上的多个窗口可以同时接收键盘输入。这也可能会导致奇怪的行为。
- (etc ...)钩子不会被调用这个输入,你的键盘/输入驱动程序不会看到它,它不会被DirectInput等东西识别......基本上它是一个永无止境的拼凑而成通过做一些不好的方法来解决问题。
这些副作用是没有办法的;这是做黑幕的结果。
一个解决方案,你的目的,因为你的目标一个特定的应用程序,可以结合使用PostMessage
与SetKeyboardState模拟包括移仓键盘状态。
好吧,我想你在这里的生活一团糟,PostMessage()
是臭名昭著的not working well with shift states,和挂钩不会得到或者叫做。微软建议您使用SendInput()
,我也是如此。我建议您发布一个新问题,或者更新这个问题,详细说明您想要实现的目标,也许我们可以更好地推荐一个不同的解决方案。
至于扩展部分,它与此无关,并不会帮助你。
什么可能尝试发送一个WM_KEYDOWN消息,说移动键被按下,然后发送另一个消息与您所需的键,然后发送一个WM_KEYUP转移消息。我怀疑这会起作用,但你可以随时尝试。
不要使用PostMessage!它不起作用。使用SendInput。 – 2011-02-09 12:55:16
我现在已经介绍了更多我尝试做的事情。希望你能帮助我 – magol 2011-02-10 10:58:29