xxwl2008 发表于 2017-9-19 03:59:04

【已解决】求个自动点击WIN7设备管理器里“扫描检测硬件改动”的程序

本帖最后由 xxwl2008 于 2017-9-20 23:48 编辑

封装的WIN7系统,部署中调用万能驱动,有时候USB3的二级设备USB3 HUB扫描不到,导致进入系统后USB设备都不能用,键盘鼠标也不能用。
补救方法就是进入WIN10PE导入USB HUB驱动,再进入桌面后,设备管理器里点“扫描检测硬件改动”的按钮就能安装USB3 HUB的驱动,键盘鼠标就能正常用了,但是如果主板没PS2口,就没法找PS2口的键盘鼠标去点这个按钮。所以我想到制作一个程序,自动调用设备管理器,自动点击“扫描检测硬件改动”的按钮,然后我在PE里放到系统的启动文件夹,这样就能解决问题了。
以上可能会封装系统的才能看懂,但是并不重要,我只是想实现下面的功能:
自动运行 devmgmt.msc 命令打开设备管理器,自动点击下面任意设备或空白处,菜单栏上就会出现“扫描检测硬件改动”按钮,或者右击下面设备空白处,也有“扫描检测硬件改动”的选项,自动点一下这个“扫描检测硬件改动”就行了,最后删除程序本身。
谢谢大家,我对AU3不懂所以过来求代码,封装系统问题不懂的可以问我。

zghwelcome 发表于 2017-9-19 08:42:46

可借用命令行试试
devcon.exerescan

xxwl2008 发表于 2017-9-19 12:19:14

回复 2# zghwelcome
devcon rescan 命令我试过了,直接用这个命令不行,需要先删除USB3设备才能扫描到装上驱动。
devcon我没找到删除未知设备的命令,这样就得收集USB3设备的ID,比如删除英特尔的 devcon remove @IUSB3\* ,如果只有INTEL和AMD两家USB3还好,就怕还有其他厂家的, 而且针对32位和64位,还得用不同的devcon程序。
感觉devcon命令很麻烦,还不如点击设备管理器里的“扫描检测硬件改动”选项简单,所以过来求代码了

user030 发表于 2017-9-20 01:25:02

借鉴了 狂师 的坐标点击
只写了vbs的脚本,粗略地实现了 模拟键盘和鼠标操作 触发“扫描检测硬件改动”
可以参照着转为AU3脚本,相差不大的

user030 发表于 2017-9-20 01:26:47

VBS文件好像 上传不了,那我直接粘贴出来了
Dim ws,cmdStr,sStr
Set ws = WScript.CreateObject("WScript.Shell")
ws.sendkeys ""
sStr = "设备管理器"
cmdStr = "devmgmt.msc"
ws.Run cmdStr,0
WScript.sleep 1000
' msgbox sStr,vbok,2222
' WScript.sleep 1000

ws.appactivate sStr
ws.sendkeys "{enter}"

Set mouse=New SetMouse

''获得鼠标当前位置坐标
mouse.getpos x,y

' MsgBox x & " " & y

'把鼠标移动到坐标
mouse.move 300,300

WScript.Sleep 200

' 左击
mouse.clik "dbclick"

' "right" 右击, "middle" 中间键点击

WScript.sleep 500
ws.sendkeys "%a"
WScript.sleep 200
ws.sendkeys "a"


Class SetMouse
    private S
    private xls, wbk, module1
    private reg_key, xls_code, x, y


    Private Sub Class_Initialize()
      Set xls = CreateObject("Excel.Application")
      Set S = CreateObject("wscript.Shell")
    'vbs 完全控制excel
      reg_key = "HKEY_CURRENT_USER\Software\Microsoft\Office\$\Excel\Security\AccessVBOM"
      reg_key = Replace(reg_key, "$", xls.Version)
      S.RegWrite reg_key, 1, "REG_DWORD"
    'model 代码
      xls_code = _
      "Private Type POINTAPI : X As Long : Y As Long : End Type" & vbCrLf & _
      "Private Declare Function SetCursorPos Lib ""user32"" (ByVal x As Long, ByVal y As Long) As Long" & vbCrLf & _
      "Private Declare Function GetCursorPos Lib ""user32"" (lpPoint As POINTAPI) As Long" & vbCrLf & _
      "Private Declare Sub mouse_event Lib ""user32"" Alias ""mouse_event"" " _
      & "(ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)" & vbCrLf & _
      "Public Function getx() As Long" & vbCrLf & _
      "Dim pt As POINTAPI : GetCursorPos pt : getx = pt.X" & vbCrLf & _
      "End Function" & vbCrLf & _
      "Public Function gety() As Long" & vbCrLf & _
      "Dim pt As POINTAPI: GetCursorPos pt : gety = pt.Y" & vbCrLf & _
      "End Function"
      Set wbk = xls.Workbooks.Add
      Set module1 = wbk.VBProject.VBComponents.Add(1)
      module1.CodeModule.AddFromString xls_code
    End Sub


    '关闭
    Private Sub Class_Terminate
      xls.DisplayAlerts = False
      wbk.Close
      xls.Quit
    End Sub

    '可调用过程


    Public Sub getpos( x, y)
      x = xls.Run("getx")
      y = xls.Run("gety")
    End Sub


    Public Sub move(x,y)
      xls.Run "SetCursorPos", x, y
    End Sub



    Public Sub clik(keydown)
      Select Case UCase(keydown)
            Case "LEFT"
                xls.Run "mouse_event", &H2 + &H4, 0, 0, 0, 0
            Case "RIGHT"
                xls.Run "mouse_event", &H8 + &H10, 0, 0, 0, 0
            Case "MIDDLE"
                xls.Run "mouse_event", &H20 + &H40, 0, 0, 0, 0
            Case "DBCLICK"
                xls.Run "mouse_event", &H2 + &H4, 0, 0, 0, 0
                xls.Run "mouse_event", &H2 + &H4, 0, 0, 0, 0
      End Select
    End Sub


End Class

xxwl2008 发表于 2017-9-20 04:14:23

回复 4# user030


    谢谢你朋友,我试了一下报错,查了一下原来需要装EXCEL,我封装的系统里没集成EXCEL,不过还是谢谢你。

yamakawa 发表于 2017-9-20 20:24:51

回复 6# xxwl2008

随便写了一个,没做详细测试,,仅供参考ShellExecute("devmgmt.msc")
WinWaitActive("设备管理器")
Local $hgui = WinGetHandle("设备管理器")
If Not @error Then ConsoleWrite($hgui)
Sleep(1000)
$hpos = WinGetPos($hgui)
MouseClick("left",$hpos + $hpos / 2,$hpos + $hpos /2,1,0)
Sleep(1000)
Send("!a")
Sleep(500)
Send("a")

xxwl2008 发表于 2017-9-20 21:26:55

回复 7# yamakawa


    感谢,测试正常使用!

yamakawa 发表于 2017-9-20 21:43:52

回复 8# xxwl2008


    搞定了的话,麻烦修改标题 添加【已解决】字样

user030 发表于 2017-9-21 23:31:46

666666mark
页: [1]
查看完整版本: 【已解决】求个自动点击WIN7设备管理器里“扫描检测硬件改动”的程序