3

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

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

根据这篇MSDN 文章

DirectInput 是一组 API 调用,用于抽象系统上的输入设备。在内部,DirectInput 创建了第二个线程来读取 WM_INPUT 数据,使用 DirectInput API 会比直接读取 WM_INPUT 增加更多开销。

directInput 使用 WM_INPUT 工作。

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

所以 SendInput 也提供了抽象。

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

4

1 回答 1

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;
于 2017-01-25T04:53:18.323 回答