本帖最后由 yhxhappy 于 2010-6-4 19:00 编辑
第一次发贴, 标题什么起都觉得怪
以下代码是我修改后发上来的,本意并不是取得设备名并显示出来,只供参考#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GuiTreeView.au3>
#include <SetupApi.au3>
Global $aClass = _CM_Enumerate_Classes()
Local $HardwareID[1][2]
Local $Class[1][2]
_HardwareScan()
_ArraySort($Class)
_ArraySort($HardwareID)
_GUI()
Func _HardwareScan()
Local $Noclass = "{8ECC055D-047F-11D1-A537-0000F8753ED1}";|非即插即用驱动程序
For $i = 1 To $aClass[0][0]
If $aClass[$i][0] = $Noclass Then ContinueLoop
$Device = _CM_Enum_Device_Info($aClass[$i][0]) ;根据 Class 来枚举子项设备
If $Device[0][0] = 0 Then ContinueLoop ;如果该 Class 下的子设备为 0 则跳过
For $a = 1 To $Device[0][0]
$iStatus = _CM_Get_DevNode_Status($Device[$a][2]) ;根据设备号来判断设备是否在 设备管理器 内显示出来 $DN_NO_SHOW_IN_DM
If bitAND($iStatus, $DN_NO_SHOW_IN_DM) Then ContinueLoop
ReDim $HardwareID[UBound($HardwareID)+1][5]
$HardwareID[UBound($HardwareID)-1][1] = $aClass[$i][1] ;将设备所属的 Class 写进 $Hardware_ID[0]
$HardwareID[UBound($HardwareID)-1][0] = $Device[$a][0]
$HardwareID[0][0] = UBound($HardwareID)-1
If _ArraySearch($Class, $aClass[$i][1]) = -1 Then
ReDim $Class[UBound($Class)+1][2] ;将本项设备的 Class 写进 $Class数组
$Class[UBound($Class)-1][0] = $aClass[$i][1]
$Class[0][0] = UBound($Class)-1
EndIf
Next
Next
EndFunc
Func _GUI()
$FORM = GUICreate("", 600, 700)
$Tree = GUICtrlCreateTreeView(0, 0, 600, 700)
GUISetState(@SW_SHOW) ; 显示窗口
$hItem = GUICtrlCreateTreeViewItem(@ComputerName, $Tree)
For $i = 1 To $Class[0][0]
$hItem2 = GUICtrlCreateTreeViewItem($Class[$i][0], $hItem)
For $a = 1 To $HardwareID[0][0]
If $HardwareID[$a][1] = $Class[$i][0] Then
GUICtrlCreateTreeViewItem($HardwareID[$a][0], $hItem2)
EndIf
Next
Next
GUICtrlSetState($hItem, $GUI_EXPAND)
;运行窗口直到用户关闭
While 1
If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
WEnd
EndFunc
上面的代码 我是先枚举系统内全部可用的CLASS,再根据CLASS枚举全部的硬件,最后判断该硬件是否在设备管理器内显示,是则写进数组最后显示到GUI上
现在碰到的问题是,不知道如何识别 未安装驱动的设备。虽然在设备管理器里面是显示“未知设备”里面,但是查看注册表该设备并不属于任何CLASS,所以通过枚举CLASS的方法行不通
现在只能通过别的方式枚举设备了
还请各位大大能解答一下 |