2013-05-30 76 views
2

在Windows中捕獲和錄製全局USB鼠標事件的最佳方式是什麼?我已經使用low level mouse callback編寫了一個小數據捕獲程序。但是,這對我來說不夠低級:這種方法允許您在屏幕上捕獲鼠標光標的位置(即屏幕座標),而不是捕獲事實上相對運動的實際鼠標事件(請考慮delta-x和delta-y)。錄製USB鼠標事件

我可以看看每個事件的位置增量,但由於屏幕座標在0和屏幕寬度/高度之間剪切,所以有些數據會丟失。此外,我不知道如果像遊戲這樣的全屏程序會改變屏幕分辨率或做其他可能影響鼠標事件的事情會發生什麼情況。

那麼有沒有其他的用戶模式方法記錄的USB鼠標事件的級別低於SetWindowsHookEx掛鉤?我希望在Windows進行任何處理之前先了解物理鼠標事件。

+0

下一步是USB過濾器驅動程序,以便您可以看到低級別的流量。花大約一年的時間來學習驅動程序編程技巧。不完全值得這個功能,但當你完成後,你當然會更多地瞭解USB和驅動程序。然而,你無法在這裏獲得幫助。 –

+0

@HansPassant編寫設備驅動程序正是我希望避免的!我有一些經驗,但已經有很多年了,我只記得那是一個如此複雜的世界。 – AlefSin

回答

3

由於沒有人回答,我只是報告迄今爲止我發現的。據我所知,至少有5種方法在Windows記錄鼠標數據:

  1. LowLevelMouseProc回撥機制。這種方法的侷限性在於它報告了鼠標光標在屏幕上的位置,而不是從鼠標接收到的原始數據。這意味着數據已經被處理。

  2. raw input API捕獲從鼠標(或任何其他HID設備)發送的原始數據。

  3. DirectInput允許您以最小的延遲捕獲原始鼠標和鍵盤(以及其他設備)的數據。 DirectInput的情況有點令人困惑,因爲它是一箇舊的API和新的API取代它,XInput不支持所有的devices the older one did

  4. event tracing API它允許您捕獲用戶模式程序中的內核級ETW蹤跡。

  5. 編寫一個KMDF過濾器設備驅動程序來捕獲鼠標USB流量的最低級別。

最後的解決方案是最複雜和最強大的解決方案。有很少的商業應用程序可以做到這一點(還有更多!)。 BusHound就是一個例子。

我不太確定第四種解決方案(ETW方法)。顯然,它最適用於最新版本的Windows。我找不到任何類似於我腦海中(即錄製原始鼠標事件)的示例程序。此外,它似乎很複雜,即使是一個簡單的測試程序也需要相當大的努力來編寫。最後,我不知道它會讓我得到實際的鼠標報告。

第二種解決方案,原始輸入API的使用非常簡單。我可以編寫一個簡單的程序在幾個小時內使用它。但是,它有一個很大的限制:它基於發送到應用程序窗口的WM_INPUT消息。如果時機很關鍵,在我的情況下,這種方法是有限的,因爲應用程序的消息循環順序處理消息。因此,從USB端口捕獲鼠標事件的時間到適當的消息處理程序被調用的時間的延遲不是固定的或甚至是有界的。

總而言之,我沒有想出任何簡單的問題答案。