如何確定哪些devnodes屬於早期版本的Windows中的單個物理設備?替代Windows 7設備ContainterIDs
編輯:
我想這樣做是因爲實現事件系統,廣播,當設備被移除,否則可能需要該系統產生超過必要的事件類似的Xbox控制器取出事件的原因(它有3個接口和2個devnode)。除了可用於建立構成單個實體的部分之間的對應關係的ContainerID之外,我找不到任何其他內容。
我正在尋找一種替代方案,它可以讓我確定這種對應關係,並允許我的程序在老版本的Windows上運行。
ANOTHER編輯:
ContainerID屬性是不可靠的。我已經找到2個具有相同ContainerID的xbox 360控制器條目,但它們對應於不同的物理控制器。
我已經解決了這個問題,下面,這與提供的序列號設備(例如Xbox 360個的控制器)的作品,以及與那些不這樣做(如價格便宜,仿製PS3有線USB控制器):
Algorithm:
Find a matching HID device ID for a given USB device ID
input: usb_device_id as a string (e.g. "USB\VID_045E&PID_028E\00E102A")
output: The corresponding HID device ID string
HKEY usb_keys <- open_key("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB")
HKEY hid_keys <- open_key("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HID")
HKEY device_key <- open_key("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\"+usb_device_id)
string prefix <- device_key.ParentIdPrefix
retry
for each key in usb_keys
for each subkey in key
if prefix occurrs in subkey.name
prefix <- subkey.ParentIdPrefix
goto retry
endif
endfor
endfor
for each key in hid_keys
for each subkey in key
if prefix occurrs in subkey.name
return "HID\"+key.name+"\"+subkey.name
endif
endfor
endfor
return null
爲了簡潔起見,我寫了這個僞代碼,因爲C++版本很長(儘管它只使用一個循環而不是兩個而不涉及轉到)。請注意,key.name
指的是密鑰的名稱,而subkey.ParentIdPrefix
表示使用RegGetValue
來獲取該屬性。產生的設備ID可以傳遞給CM_Locate_DevNode
。批評是受歡迎的,因爲我不確定這是否像我認爲的那樣穩健。
適用於我測試過的大多數遊戲手柄和鍵盤。不幸的是,它只在插入時纔有效,而在xbox 360控制器等設備上失敗,因爲它們在註冊表中的排列方式不同。我注意到,對於提供序列號的設備也是如此,這些序列號似乎具有相同的密鑰組織。 – defube