创建一个屏幕键盘

时间:2011-02-09 12:06:35

标签: c# c++ winapi

我使用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} {NN ESC} NN
  • {ESC} NN
  • ½NN
  • §NN

其中{ESC}模拟按下Esc键,NN是十六进制值,§/½让程序听。

通常我们有专门的物理键盘来控制程序,但它们很贵。因此,在我们并不总是拥有物理键盘的测试环境中,我们必须手动输入这些代码

3 个答案:

答案 0 :(得分:5)

你必须妥协:

如果你想模拟键盘输入,那么你必须使用SendInput,这意味着受到当前焦点的窗口的支配。 SendInput就像敲击物理键盘上的按键一样。使用键盘将键击发送到特定窗口的唯一方法是ALT+TAB到右侧窗口。

如果您想将击键发送到特定窗口,那么您会产生一种时髦的行为:

  1. 应用程序处理输入的方式不同简单的WM_KEYDOWN / WM_KEYUP消息不是检测键盘输入的唯一方法。例如,还有键盘状态(GetKeyboardState()),您将难以模拟。这很可能是您遇到的情况。
  2. 应用程序可能依赖于在接收键盘输入消息时具有焦点的标准行为。通过向这些应用程序发布消息,您可以调用可能导致其崩溃的奇怪的无序行为。
  3. 现在系统上的多个窗口可以同时接收键盘输入。这也可能导致奇怪的行为。
  4. (等等......)不会为此输入调用挂钩,键盘/输入驱动程序将无法看到它,也不会被DirectInput等识别出来......基本上它是一个永无止境的拼凑而成通过做坏事的方式解决问题。
  5. 没有办法解决这些副作用;这是做阴暗事物的结果。


    针对您的目的的解决方案,因为您定位的是单个特定应用,可能会将PostMessageSetKeyboardState结合使用来模拟键盘状态,包括移位位置。

答案 1 :(得分:2)

好吧,我认为你在这里搞得一团糟,PostMessage()not working well with shift states而臭名昭着,钩子也不会被调用。 Microsoft建议使用SendInput(),我也是。我建议你发布一个新问题,或者更新这个问题,详细说明你想要实现的目标,也许我们可以更好地推荐一个不同的解决方案。 / p>

至于扩展部分,它根本与此无关,对你没有帮助。

可以尝试的内容,是发送WM_KEYDOWN消息,其中显示已按下shift键,然后在发送WM_KEYUP转移消息之前发送带有所需密钥的另一条消息。我怀疑这会奏效,但你可以随时尝试。

答案 2 :(得分:1)

我个人会为此目的使用SendKey.Send()。

MSDN page