2014-01-12 61 views
3

我有一個有點不幸設計的HID設備(Griffin Powermate),因爲在您打開它時,「Rotation Axis」HID元素的輸入值不會改變,除非旋轉速度急劇變化或除非方向改變。它發送了許多HID報告(角度分辨率似乎約爲4deg,因爲我每次旋轉獲得約90個報告 - 不是很好,但無論...),但它們都報告相同的值(通常爲-1或1 CCW和CW分別 - 如果你轉速更快,它會報告-2 & 2等等,但你必須更快地轉動由於這種不幸的行爲,我發現這個東西很大程度上沒用。是否可以從用戶空間創建虛擬IOHIDDevice?

我想到我可能能夠編寫一個後臺用戶空間應用程序,該應用程序佔用了物理設備,並向另一個虛擬設備顯示了一些小的添加項,以便爲每個報告導致輸入值更改(例如,這是HID規範支持的累積器 - 上帝只知道爲什麼格里芬沒有)

但我沒有看到如何從用戶空間創建虛擬設備的內核端對象,我開始認爲這可能是不可能的。我看到了this question,它的適應症並不好,但在細節上很低。

另外,如果有一種方法,我欺騙現有設備上的報道,我想它會報告後,立即將做得一樣好,因爲我可以將其設置回零-1或1

有任何想法嗎?

回答

3

首先,您可以通過Quartz Event Services模擬輸入事件,但這可能不足以達到您的目的,因爲這主要是爲了模擬鍵盤和鼠標事件而設計的。

其次,IOKit框架的HID驅動程序系列包含(global)IOHIDResource服務上的用戶客戶端,名爲IOHIDResourceDeviceUserClient。看起來這可以根據用戶空間的命令產生IOHIDUserDevice實例。特別是,用戶空間IOKitLib包含一個IOHIDUserDeviceCreate函數,這似乎應該能夠做到這一點。 HID家族源代碼甚至有一些demo of this which creates a virtual keyboard的種類。不幸的是,儘管我可以構建它,但它在IOHIDUserDeviceCreate調用中失敗。 (我可以在IORegistryExplorer中看到從未創建過IOHIDResourceDeviceUserClient實例。)由於時間不夠,我沒有進一步調查,但如果需要它的功能,似乎值得追求。

相關問題