【问题标题】:How to send keyboard events to all kind of applications in windows?如何将键盘事件发送到 Windows 中的各种应用程序?
【发布时间】:2017-03-12 03:24:19
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ windows keyboard-events


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      nInputspInputs 数组中的结构数。

      pInputsINPUT 结构的数组。每个结构都代表一个要插入到键盘或鼠标输入流中的事件。

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

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

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

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

      由于触摸键盘使用 winnls.h 中定义的代理宏向系统发送输入,因此键盘事件挂钩上的侦听器必须解码源自触摸键盘的输入。有关详细信息,请参阅代理和补充字符。

      辅助功能应用程序可以使用SendInput 来注入与由外壳处理的应用程序启动快捷键相对应的击键。不保证此功能适用于其他类型的应用程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-31
        • 2014-01-21
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多