SendInput到后台窗口

时间:2016-02-15 11:43:23

标签: c++ winapi sdl sendinput directinput

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

为了解决这个问题,我使用了PostMessage(hwnd,...),hwnd正在处理游戏窗口。但是如果游戏使用DirectInput,这不起作用。这是通过挂钩GetDeviceState解决的。现在我开始研究的另一个游戏是使用WM_INPUT或原始输入,我必须创建原始输入以使其工作。

根据此MSDN Article

  

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

directInput使用WM_INPUT工作。

  

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

所以SendInput也提供了抽象。

我想要的是即使窗口没有聚焦,也可以独立地将输入发送到应用程序。这样我就可以一次向多个游戏发送输入。有没有办法使用一个更高级别的API调用,如SendInput来实现这一目标?可以使用SendInput完成吗?那有没有C / C ++库?

1 个答案:

答案 0 :(得分:5)

使用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;