将输入发送到后台窗口

SendInput to background window

本文关键字:后台 窗口 输入      更新时间:2023-10-16

我想将从安卓客户端接收的鼠标和键盘输入发送到在Windows上运行的游戏。 SendInput适用于我迄今为止玩过的几乎所有游戏。但要让SendInput发挥作用,游戏必须是一个前景窗口。

为了解决这个问题,我使用了PostMessage(hwnd,...),hwnd 是游戏窗口的句柄。但是,如果游戏使用直接输入,则这不起作用。这是通过钩GetDeviceState解决的。现在我开始开发的另一个游戏是使用WM_INPUT或原始输入,我必须创建原始输入才能使其正常工作。

根据这篇 MSDN 文章

直接输入是一组 API 调用,用于抽象 系统。在内部,DirectInput 创建第二个线程来读取 WM_INPUT数据,并使用直接输入 API 会增加更多开销 而不是简单地直接阅读WM_INPUT。

直接输入使用 WM_INPUT 工作。

SendInput 函数在 INPUT 结构中插入事件 串行到键盘或鼠标输入流中。这些事件不是 穿插着插入的其他键盘或鼠标输入事件 用户(使用键盘或鼠标(或通过调用keybd_event, mouse_event,或对 SendInput 的其他调用。

所以SendInput也提供了抽象。

我想要的只是将输入独立地发送到应用程序,即使它的窗口没有焦点。这样我就可以一次向多个游戏发送输入。有没有办法使用像 SendInput 这样的更高级别的 API 调用来实现这一点?这可以通过SendInput完成吗?是否有任何 C/C++ 库?

使用 RAWINPUTDEVICE 结构注册输入设备时,将dwFlags = RIDEV_EXINPUTSINK设置为在进程处于后台时接收输入。

例:

RAWINPUTDEVICE rid;
rid.usUsagePage = 1;
rid.usUsage     = 4;    // Joystick
rid.dwFlags     = RIDEV_EXINPUTSINK;
rid.hwndTarget  = window;
if (!RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE)))
    return -1;