如何将键盘事件发送到 windows 中的各种应用程序?

How to send keyboard events to all kind of applications in windows?

我们有一个简单的 C++ 程序,它 send/simulate return 使用 keybd_event 激活 window 的关键事件。

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

这适用于所有类型的 windows 应用程序。但我们喜欢将键盘事件发送到第三方应用程序,如 GTA(游戏)——这是行不通的。 GTA收不到键盘事件

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

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

keybd_event 是过时的 API 调用。尝试使用moder SendInput API function

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 处理的应用程序启动快捷键相对应的击键。不保证此功能适用于其他类型的应用程序。