软件的问题我就不讨论了,至于驱动安装完成与否,可以通过判断注册表里面的版本与安装的版本是否一致,一致则表示安装成功。虽然不能100%正确,但还是比较稳妥的
下面的源码是演示如何取设备的驱动版本,楼主自己研究吧#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GuiTreeView.au3>
#include <SetupApi.au3>
Local $Hardware[1][4]
Local $Class[1][2]
$FORM = GUICreate("本机硬件信息", 800, 700)
$Tree = GUICtrlCreateTreeView(0, 0, 800, 700)
_HardwareScan()
GUISetState(@SW_SHOW) ; 显示窗口
;运行窗口直到用户关闭
While 1
If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
WEnd
Func _HardwareScan() ;扫描本机硬件信息并将信息添加至 TREE 控件
$aClass = _CM_Enumerate_Classes()
For $i = 1 To $aClass[0][0]
If $aClass[$i][0] = "{8ECC055D-047F-11D1-A537-0000F8753ED1}" Then ContinueLoop ;非即插即用设备 排除
;If $Class[$i][0] = "{4d36e96b-e325-11ce-bfc1-08002be10318}" Then ContinueLoop ;PS2键盘 排除
;If $Class[$i][0] = "{4d36e96f-e325-11ce-bfc1-08002be10318}" Then ContinueLoop ;PS2鼠标 排除
;If $Class[$i][0] = "{745A17A0-74D3-11D0-B6FE-00A0C90F57DA}" Then ContinueLoop ;USB输入设备,含USB鼠标 排除
;If $Class[$i][0] = "{36FC9E60-C465-11CF-8056-444553540000}" Then ContinueLoop ;通用串行总线控制器 排除
;If $Class[$i][0] = "{4D36E96E-E325-11CE-BFC1-08002BE10318}" Then ContinueLoop ;监示器 排除
$Device = _CM_Enum_Device_Info($aClass[$i][0]) ;根据 Class 来枚举子项设备
If $Device[0][0] <> 0 Then ;如果该 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
$ID = _CM_Get_DevNode_Registry_Property($Device[$a][2], 2) ;根据设备中断号取硬件ID
$xx = StringInStr($ID, "" ) ;在硬件ID里面查找 \ 这个符号
If $xx = 0 Then ;如果没有打到,则这个ID就当做硬件ID来使用
$HardwareID = $ID
Else
$IDarray = StringSplit($ID, StringMid($ID, 1, $xx), 1) ;使用特定字符将ID字符串分割,例如PCI\,IDE\,
$HardwareID = $IDarray[2]
EndIf
ReDim $Hardware[UBound($Hardware)+1][4]
$Hardware[UBound($Hardware)-1][1] = $aClass[$i][1] ;将设备所属的 Class 写进 $Hardware_ID[0]
$Hardware[UBound($Hardware)-1][0] = $Device[$a][0] ;将设备名称 写进数组
$Hardware[UBound($Hardware)-1][2] = Get_Driver_Version($Device[$a][2]) ;根据设备中断号取驱动版本 那个数字是不是中断号我也不确定,自己这么理解的
$Hardware[UBound($Hardware)-1][3] = $HardwareID
$Hardware[0][0] = UBound($Hardware)-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
EndIf
Next
_ArraySort($Class) ;排序类数组
_ArraySort($Hardware) ;排序硬件数组
$hItem = GUICtrlCreateTreeViewItem(@ComputerName, $Tree) ;计算机名添加进 TREE控件
For $i = 1 To $Class[0][0]
$hItem2 = GUICtrlCreateTreeViewItem($Class[$i][0], $hItem) ;大类
For $a = 1 To $Hardware[0][0]
If $Hardware[$a][1] = $Class[$i][0] Then
$hItem3 = GUICtrlCreateTreeViewItem($Hardware[$a][0], $hItem2) ;硬件添加进 TREE内的大类,如显卡设备属于 显示适配器 类
GUICtrlCreateTreeViewItem("硬件ID:" & $Hardware[$a][3], $hItem3)
GUICtrlCreateTreeViewItem("驱动版本:" & $Hardware[$a][2], $hItem3)
EndIf
Next
Next
GUICtrlSetState($hItem, $GUI_EXPAND) ;展开 TREE 控件 根目录
EndFunc
Func Get_Driver_Version($hDevInst) ;取得驱动的版本,根据中断号
$ClassGUID = _CM_Get_DevNode_Registry_Property($hDevInst, 10)
If $ClassGUID = "" Then Return "Unknown" ;如果范例ID为空,则返回0并退出
If @OSArch = "X86" Then
$Reg = "HKLM\SYSTEM\ControlSet001\Control\Class"
Else
$Reg = "HKLM64\SYSTEM\ControlSet001\Control\Class"
EndIf
$Version = RegRead($Reg & $ClassGUID, "DriverVersion")
If $Version = "" Then ;如果使用逗号无法分割,则说明读取到的内容不符,返回0
Return "Unknown"
Else
Return $Version
EndIf
EndFunc
|