找回密码
 加入
搜索
查看: 5551|回复: 15

通过注册表子键子项项值得到子键名(通过硬件ID号在注册表中禁用硬件的应用)

  [复制链接]
发表于 2009-12-10 14:10:20 | 显示全部楼层 |阅读模式
本帖最后由 qqgghh1 于 2009-12-11 11:14 编辑

我自己想的代码如下
Local $i = 0 ,$var,$var1,$var2,$var3
While 1  ;遍历services所有子键名
        $j = 0 
        $i+=1
        $var1 = RegEnumKey("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services",$i);子键名
        If @error <> 0 then ExitLoop
        
        while 1;遍历某一子键所有子项
                $j+=1
                $var2 = RegEnumVal("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services"&$var1&"\Enum",$j);子项名
                If @error <> 0 then ExitLoop
                $var3 = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services"&$var1&"\Enum",$var2) ;子项值
                If $var3 = "HID\VID_046D&PID_C00C\6&2630305&0&0000" Then ;这个是通过另外一段代码获取的硬件设备范例ID
                        MsgBox(0,"子键为第"&$i&"位,子键名为"&$var1&",以下为其子项数据","第"&$j&"子项名为:"&$var2&",值为:"&$var3)
                EndIf        
                
        WEnd
        
WEnd
无法实现,我不知道问题出在哪里,恳请大大们协助。

评分

参与人数 1金钱 +10 收起 理由
pusofalse + 10 感谢主动修改帖子分类为[已解决]。

查看全部评分

发表于 2009-12-10 14:13:43 | 显示全部楼层
少了个 "WEnd" ?
 楼主| 发表于 2009-12-10 14:15:25 | 显示全部楼层
谢谢,刚复制错了,改好了
 楼主| 发表于 2009-12-10 14:19:19 | 显示全部楼层
下面是获取硬件设备范例ID的代码,并能实现在设备管理器中禁用或启用硬件,我第一帖的代码是想除了在设备管理器中禁用(设备管理器中禁用后有管理员权限很容易就可以手动开启了),在注册表里更改键值,一般人不知道去哪里更改。以下代码全部参考Pusofalse的代码,特别声明。
$testdata = InputBox("你好","这是一个测试程序","请输入要测试对象名","")
Local $hDevs, $tDevInfo, $sDeviceID,$aMouse[1][2] = [[0]]
$hDevs = _SetupDiGetClassDevs($DIGCF_PRESENT, $testdata)
While _SetupDiEnumDeviceInfo($hDevs, $aMouse[0][0], $tDevInfo)
        $aMouse[0][0] += 1
        $sDescr = _SetupDiGetDeviceRegistryProperty($hDevs, $tDevInfo, $SPDRP_DEVICEDESC)
        $sName = _SetupDiGetDeviceRegistryProperty($hDevs, $tDevInfo, $SPDRP_FRIENDLYNAME)
        If $sName <> "" Then $sDescr = $sName
        Redim $aMouse[$aMouse[0][0] + 1][2]
        $aMouse[$aMouse[0][0]][0] = $sDescr        ; 鼠标描述信息
        $aMouse[$aMouse[0][0]][1] = _SetupDiGetDeviceInstanceID($hDevs, $tDevInfo) ; 设备范例ID
                MsgBox(0,"1",$aMouse[$aMouse[0][0]][1])
                ;FileWriteLine(@DesktopDir&"\1.log",$aMouse[$aMouse[0][0]][1] & @CRLF)
                $sDeviceID = $aMouse[$aMouse[0][0]][1]; 硬件设备范例ID。
                _SetupDiCreateDeviceDevs($sDeviceID, $hDevs, $tDevInfo)
                $fResult = _SetupDiDisableDevice($hDevs, $tDevInfo, True) ; 禁用
                If $fResult = True Then
                                Msgbox(0, "", $testdata&"禁用成功")
                Else
                                Msgbox(0, "", "错误码:" & @error)
                EndIf
                $fResult = _SetupDiDisableDevice($hDevs, $tDevInfo, False) ; 启用。
                _SetupDiDestroyDeviceInfoList($hDevs) ; 销毁设备信息集。
WEnd        
 楼主| 发表于 2009-12-10 17:02:22 | 显示全部楼层
自己的问题自己顶
发表于 2009-12-10 17:54:10 | 显示全部楼层
没问题呀,lz运行情况大体是什么样
 楼主| 发表于 2009-12-10 18:14:59 | 显示全部楼层
本帖最后由 qqgghh1 于 2009-12-10 18:16 编辑

Local $i = 0 ,$var,$var1,$var2,$var3
While 1  ;遍历services所有子键名
        $j = 0
        $i+=1
        $var1 = RegEnumKey("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services",$i);子键名
        If @error <> 0 then ExitLoop
        
        while 1;遍历某一子键所有子项
                $j+=1
                $var2 = RegEnumVal("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\"&$var1&"\Enum",$j);子项名
                If @error <> 0 then ExitLoop
                $var3 = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\"&$var1&"\Enum",$var2) ;子项值
                If $var3 = "HID\VID_046D&PID_C00C\6&2630305&0&0000" Then ;这个是通过另外一段代码获取的硬件设备范例ID
                        MsgBox(0,"子键为第"&$i&"位,子键名为"&$var1&",以下为其子项数据","第"&$j&"子项名为:"&$var2&",值为:"&$var3)
                EndIf        
               
        WEnd
        
WEnd

这两句
If $var3 = "HID\VID_046D&PID_C00C\6&2630305&0&0000" Then ;这个是通过另外一段代码获取的硬件设备范例ID
                        MsgBox(0,"子键为第"&$i&"位,子键名为"&$var1&",以下为其子项数据","第"&$j&"子项名为:"&$var2&",值为:"&$var3)

理想状态下应该显示当遍历获取子键某一项值的数值($var3)为HID\VID_046D&PID_C00C\6&2630305&0&0000 时,返回它对应的子键名$var1等变量值。我搜索了一下注册表,在
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services 下的子键中,只有Mouclass 和mouhid和鼠标有关系的子键下面的某一项值的数值为HID\VID_046D&PID_C00C\6&2630305&0&0000。
但实际运行后,返回好多个子键出来,虽然也包含了Mouclass 和mouhid这两个满足条件的,还有好多不满足条件的也出来了,很郁闷。
发表于 2009-12-10 18:27:01 | 显示全部楼层
本帖最后由 netegg 于 2009-12-10 18:38 编辑

MsgBox(0,"子键为第"&$i&"位,子键名为"&$var1&",以下为其子项数据","第"&$j&"子项名为:"&$var2&",值为:"&$var3)
把这行先换成consolewrite("子键为第"&$i&"位,子键名为"&$var1& "以下为其子项数据"&"第"&$j&"子项名为:"&$var2&" & "值为:"&$var3 & @crlf)把所有结果对着看看

我这没这个设备,没法实际测试,不好意思

评分

参与人数 1金钱 +20 收起 理由
qqgghh1 + 20

查看全部评分

 楼主| 发表于 2009-12-10 18:33:53 | 显示全部楼层
子键为第8位,子键名为aec以下为其子项数据第1子项名为:Count & 值为:0
子键为第8位,子键名为aec以下为其子项数据第2子项名为:NextInstance & 值为:0
&"第"&$j&"子项名为:"&$var2&" & 值为:"&$var3  & @crlf)
                En子键为第43位,子键名为Cdaudio以下为其子项数据第1子项名为:Count & 值为:0
子键为第43位,子键名为Cdaudio以下为其子项数据第2子项名为:NextInstance & 值为:0
&$i&"位,子键名为"&$var1& "以下为其子项数据"&"第"&$j&"子项名为:"&$var2&子键为第45位,子键名为Cdrom以下为其子项数据第1子项名为:Count & 值为:0
子键为第45位,子键名为Cdrom以下为其子项数据第2子项名为:NextInstance & 值为:0
子键为第67位,子键名为DMusic以下为其子项数据第1子项名为:Count & 值为:0
子键为第67位,子键名为DMusic以下为其子项数据第2子项名为:NextInstance & 值为:0
子键为第71位,子键名为drmkaud以下为其子项数据第1子项名为:Count & 值为:0
子键为第71位,子键名为drmkaud以下为其子项数据第2子项名为:NextInstance & 值为:0
子键为第82位,子键名为Fdc以下为其子项数据第1子项名为:Count & 值为:0
子键为第82位,子键名为Fdc以下为其子项数据第2子项名为:NextInstance & 值为:0
子键为第84位,子键名为Flpydisk以下为其子项数据第1子项名为:Count & 值为:0
子键为第84位,子键名为Flpydisk以下为其子项数据第2子项名为:NextInstance & 值为:0
子键为第106位,子键名为Imapi以下为其子项数据第1子项名为:Count & 值为:0
子键为第106位,子键名为Imapi以下为其子项数据第2子项名为:NextInstance & 值为:0

子键为第124位,子键名为kmixer以下为其子项数据第1子项名为:Count & 值为:0
子键为第124位,子键名为kmixer以下为其子项数据第2子项名为:NextInstance & 值为:0
子键为第139位,子键名为Mouclass以下为其子项数据第4子项名为:1 & 值为:HID\Vid_046d&Pid_c00c\6&2630305&0&0000
子键为第140位,子键名为mouhid以下为其子项数据第3子项名为:0 & 值为:HID\Vid_046d&Pid_c00c\6&2630305&0&0000
子键为第223位,子键名为redbook以下为其子项数据第1子项名为:Count & 值为:0
子键为第223位,子键名为redbook以下为其子项数据第2子项名为:NextInstance & 值为:0
子键为第238位,子键名为Sfloppy以下为其子项数据第1子项名为:Count & 值为:0
子键为第238位,子键名为Sfloppy以下为其子项数据第2子项名为:NextInstance & 值为:0
子键为第245位,子键名为splitter以下为其子项数据第1子项名为:Count & 值为:0
子键为第245位,子键名为splitter以下为其子项数据第2子项名为:NextInstance & 值为:0
子键为第253位,子键名为swmidi以下为其子项数据第1子项名为:Count & 值为:0
子键为第253位,子键名为swmidi以下为其子项数据第2子项名为:NextInstance & 值为:0
发表于 2009-12-10 18:43:07 | 显示全部楼层
If $var3 = "HID\VID_046D&PID_C00C\6&2630305&0&0000" Then
改为
If $var3 <> '0' And $var3 = "HID\VID_046D&PID_C00C\6&2630305&0&0000" Then
试试

评分

参与人数 1金钱 +20 收起 理由
qqgghh1 + 20

查看全部评分

 楼主| 发表于 2009-12-10 18:48:29 | 显示全部楼层
返回值正常。但是很奇怪,为什么会这样啊?
发表于 2009-12-10 18:57:55 | 显示全部楼层
本帖最后由 netegg 于 2009-12-10 18:59 编辑

$var3 = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\"&$var1&"\Enum",$var2) ;子项值
If $var3 = "HID\VID_046D&PID_C00C\6&2630305&0&0000" Then ;这个是通过另外一段代码获取的硬件设备范例ID
把这两行换成
If stringcompare(RegRead("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\"&$var1&"\Enum",$var2) , "HID\VID_046D&PID_C00C\6&2630305&0&0000")= 0  Then ;这个是通过另外一段代码获取的硬件设备范例ID
具体为什么,没想明白

评分

参与人数 1金钱 +20 收起 理由
afan + 20 还是这样感觉正确些

查看全部评分

 楼主| 发表于 2009-12-10 19:27:45 | 显示全部楼层
Hi afan and netegg,
Thanks for you great help!
 楼主| 发表于 2009-12-10 19:28:35 | 显示全部楼层
如果没有人有其它建议,明天我将结贴,感谢!
发表于 2009-12-11 01:16:50 | 显示全部楼层
结贴前留名
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2025-1-11 10:11 , Processed in 0.081114 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表