2016-02-15 143 views
1

我想將從android客戶端接收到的鼠標和鍵盤輸入發送到在Windows上運行的遊戲。 SendInput適用於我迄今爲止工作過的幾乎所有的遊戲。但是對於SendInput來說,遊戲必須是前臺窗口。SendInput到背景窗口

爲了解決這個問題,我使用了PostMessage(hwnd,...),讓hwnd處理遊戲窗口。但是,如果遊戲使用DirectInput,則這不起作用。這通過掛鉤GetDeviceState解決。現在我開始研究的另一個遊戲是使用WM_INPUT或原始輸入,我必須創建原始輸入才能使其工作。

根據該MSDN Article

DirectInput的是一組抽象 系統上的輸入設備的API調用。在內部,DirectInput創建第二個線程來讀取WM_INPUT數據,使用DirectInput API將比直接讀取WM_INPUT增加更多開銷 。

directInput使用WM_INPUT。

SendInput函數插入在輸入結構 事件串聯到鍵盤或鼠標輸入流。這些事件不是 與用戶(使用鍵盤或鼠標)或通過調用keybd_event, mouse_event或其他SendInput調用插入 插入的其他鍵盤或鼠標輸入事件。

因此SendInput也提供了抽象。

我只需要將輸入發送到獨立的應用程序,即使其窗口未聚焦。這樣我就可以一次向多個遊戲發送輸入。有什麼方法可以使用像SendInput這樣的更高級別的API調用來實現這一點嗎?這可以通過SendInput完成嗎?有沒有任何C/C++庫?

+0

遊戲做了很多嘗試和防止這種情況,原因是顯而易見的。我會考慮使用arduino板來模仿鍵盤。 – Matt

+0

@Matt SendInput本身可以很好地工作,只有它只能在聚焦窗口上工作的缺點。 – SMUsamaShah

+0

如果您查看[SendInput]的參數(https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310.aspx),應該馬上明白,您無法控制,輸入的地方。沒有更高層次的API來完成這個工作,PostMessage是錯誤的縮影。 downvote的原因:換句話說,你已經是第10萬個成員提出這個問題了:它*「不顯示研究努力」*。 – IInspectable

回答

7

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