创建一个屏幕键盘

mag*_*gol 1 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);
Run Code Online (Sandbox Code Playgroud)

我该如何处理VK的扩展部分?

编辑

我正在尝试创建一个屏幕键盘.屏幕键盘上的每个按钮都模拟一系列击键.接收器是一个旧程序,根据执行的键盘顺序执行不同的任务.键盘序列如下

  • {ESC} {NN ESC} NN
  • {} ESC NN
  • ½NN
  • §NN

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

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

ten*_*our 5

你必须妥协:

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

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

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

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


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