2016-06-28 118 views
0

我正在使用原始輸入API來監聽按鍵和鼠標點擊。到目前爲止,我有鍵盤按下工作,我可以得到事件觸發這樣,並閱讀哪個鍵被按下。但是,我無法使鼠標事件以相同的方式工作。獲取鼠標的設備ID /處理與原始輸入

當消息通過 WndProc(ref Message)進入時,有一個設備句柄從未匹配設備ID(鍵盤,鼠標和HID)列表中的任何內容。而且,原始輸入緩衝區是空的,所有字段都爲零。

有沒有人對如何/爲什麼會發生這種情況建議?

請注意,我一直試圖使用: private static extern uint GetRawInputDeviceInfo(IntPtr hDevice, uint command, ref DeviceInfo data, ref uint dataSize);來獲取有關點擊事件的源設備的任何數據,但數據也是空的/零。

感謝

編輯:

在啓動時,我得到原始輸入見過的所有設備的列表:

var pRawInputDeviceList = Marshal.AllocHGlobal((int)(dwSize * deviceCount)); 
GetRawInputDeviceList(pRawInputDeviceList, ref deviceCount, (uint)dwSize); 

一旦我有設備的這個名單我遍歷它們並將它們添加到單獨的dictionary<deviceID, eventType>

後來,當我通過WndProc(ref Message)收到消息時,我抓住message.LParam下的標識符,但這與我原始列表中的任何設備標識都不匹配。

+0

想必你打電話是'GetRawInputData'或'GetRawInputBuffer'。如果您使用的是第一個,那麼RAWINPUT結構會被封送,如果您使用第二個結構,則很可能存在問題,您可能無法正確分配內存。當你說'有一個設備句柄從來不匹配設備ID列表中的任何內容時,你還會做什麼比較? – theB

+0

@theB我加了一個編輯,我希望在解答你的問題時更好一點。我使用的是GetRawInputData(),我可以查看元帥位,看看是否有任何東西出現 –

回答

0

進一步調試後,我發現,在Visual Studio調試原始輸入是棘手的最好的。

這就是說,我的結論,那就是,如果你想步通過的操控按鍵事件和鼠標點擊原始輸入代碼,要小心,你實際上是下面的每個步驟相同的線程。在我的情況下,我會收到一個鼠標事件並擊中一個斷點。在班級間移動時,使用F10/F11逐步導致不一致。 (鼠標事件是突然的鍵事件等)

因此,我發現使用UI在Visual Studio命令跨過而進入到工作得更好,而不是引入鍵事件到流動。