如何将键盘事件发送到Windows中的所有类型的应用程序?

时间:2016-10-29 11:20:13

标签: c++ windows keyboard-events

我们有一个简单的C ++程序,它使用keybd_event将返回键事件发送/模拟到活动窗口。

keybd_event(VK_RETURN, 0x1c, 0, 0);

这适用于所有类型的Windows应用程序。但我们喜欢将键盘事件发送到第三方应用程序,如GTA(游戏) - 这不起作用。 GTA没有收到键盘事件。

为什么GTA没有收到键盘事件? 有没有办法让它与keybd_event一起使用? 或者是否有任何其他解决方案将事件发送到所有类型的应用程序(使用常见的Windows或C ++标准库)?

2 个答案:

答案 0 :(得分:2)

keybd_event是过时的API调用。尝试使用现代SendInput API函数

UINT WINAPI SendInput(
  _In_ UINT    nInputs,
  _In_ LPINPUT pInputs,
  _In_ int     cbSize
);

nInputs pInputs数组中的结构数。

pInputs一组INPUT个结构。每个结构表示要插入键盘或鼠标输入流的事件。

cbSize INPUT结构的大小(以字节为单位)。如果cbSize不是INPUT结构的大小,则函数将失败。

此功能受UIPI约束。允许应用程序仅将输入注入到具有相同或较低完整性级别的应用程序中。

SendInput函数将INPUT结构中的事件串行插入键盘或鼠标输入流。这些事件没有穿插用户(使用键盘或鼠标)或通过调用keybd_eventmouse_event或其他SendInput调用插入的其他键盘或鼠标输入事件。

此功能不会重置键盘的当前状态。调用函数时已按下的任何键可能会干扰此函数生成的事件。要避免此问题,请使用GetAsyncKeyState功能检查键盘的状态,并根据需要进行更正。

因为触摸键盘使用winnls.h中定义的代理宏来向系统发送输入,所以键盘事件挂钩上的监听器必须解码源自触摸键盘的输入。有关更多信息,请参阅代理和补充字符。

辅助功能应用程序可以使用SendInput注入与shell处理的应用程序启动快捷键对应的击键。此功能无法保证适用于其他类型的应用程序。

答案 1 :(得分:1)

此API是低级别的;因此应用程序不会直接响应它。该函数由中断处理程序调用。也许您生成的输入不完全相同,您认为此应用程序需要响应。此外,此API目前已被我建议使用的函数SendInput取代,而不是keybd_event。