创建一个屏幕键盘

我使用PostMessage来模拟后台程序中的击键。 除了需要在物理键盘上移位的字符外,它工作正常。 我如何模拟class次? “

我使用的代码大致是:

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是hex值,§/½让程序听。

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

你必须妥协:

如果要模拟键盘输入 ,则必须使用SendInput ,这意味着由哪个窗口当前具有焦点。 SendInput就像敲击物理键盘上的键。 使用键盘将键击发送到特定窗口的唯一方法是ALT+TAB到右侧窗口。

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

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

没有办法解决这些副作用; 这是做阴暗的东西的结果。


针对您的目的的解决方案 ,因为您的目标是单个特定应用程序,可能是将PostMessage与SetKeyboardState结合使用来模拟键盘状态,包括换档位置。

好吧,我认为你在这里搞得一团糟, PostMessage()因为不适合移位状态而臭名昭着,钩子也不会被调用。 Microsoft建议使用SendInput() ,我也是。我建议您发布一个新问题,或者更新这个问题,详细说明您要实现的目标,也许我们可以更好地推荐一个不同的解决方案。

至于扩展部分,它根本与此无关,也无济于事。

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

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

MSDN页面