创建一个屏幕键盘
我使用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
到右侧窗口。
如果您想将击键发送到特定窗口 ,那么您会产生一种时髦的行为:
- 应用处理输入方式不同 简单的
WM_KEYDOWN
/WM_KEYUP
消息不是检测键盘输入的唯一方法。 例如,还有键盘状态(GetKeyboardState()
),您将很难模拟。 这很可能是你遇到的。 - 应用程序可能依赖于在接收键盘输入消息时具有焦点的标准行为。 通过向这些应用程序发布消息,您可以调用可能导致其崩溃的奇怪的无序行为。
- 现在系统上的多个窗口可以同时接收键盘输入。 这也可能导致奇怪的行为。
- (等等……)不会为这个输入调用挂钩,你的键盘/输入驱动程序不会看到它,它不会被DirectInput这样的东西识别…基本上它是一个永无止境的问题拼凑而成做坏事的方式。
没有办法解决这些副作用; 这是做阴暗的东西的结果。
针对您的目的的解决方案 ,因为您的目标是单个特定应用程序,可能是将PostMessage
与SetKeyboardState结合使用来模拟键盘状态,包括换档位置。
好吧,我认为你在这里搞得一团糟, PostMessage()
因为不适合移位状态而臭名昭着,钩子也不会被调用。 Microsoft建议使用SendInput()
,我也是。我建议您发布一个新问题,或者更新这个问题,详细说明您要实现的目标,也许我们可以更好地推荐一个不同的解决方案。
至于扩展部分,它根本与此无关,也无济于事。
您可以尝试的是发送一条WM_KEYDOWN消息,其中显示已按下shift键,然后在发送WM_KEYUP转换消息之前发送带有所需密钥的另一条消息。 我怀疑这会奏效,但你可以随时尝试。
我个人会为此目的使用SendKey.Send()。
MSDN页面