我想将从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 ++库?
答案 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;