找回密码
 加入
搜索
查看: 1687|回复: 16

[AU3基础] 【已解决】ObjGet 获取对象的问题

[复制链接]
发表于 2022-3-12 14:44:26 | 显示全部楼层 |阅读模式
本帖最后由 itzyx 于 2022-3-13 13:46 编辑
Local $Ports = ''
$objWMIService = ObjGet("WinMgmts:")
$colBios = $objWMIService.ExecQuery("Select * from  Win32_PNPEntity")
For $object In $colBios
        $Ports &= StringMid($object.Caption, 1) & @CRLF
Next
$Bports = StringRegExp($Ports, '(?m).+\(COM\d+\)$', 3)
上面这段代码成功获取到了端口名称,后面我插入了新的USB设备,准备再次调用一下
$objWMIService = ObjGet("WinMgmts:")
$colBios = $objWMIService.ExecQuery("Select * from Win32_PNPEntity")  就报错了  “The requested action with this object has failed”
这个是什么原因? 插入新的设备 怎么可以重新枚举一下设备名称?希望大佬们能指点一下,万分感谢!
 楼主| 发表于 2022-3-12 14:45:48 | 显示全部楼层
上个帖子已经解决了检测设备插入的问题,现在希望可以枚举一下所有设备名称,然后匹配插入的端口名称。
发表于 2022-3-12 15:01:39 | 显示全部楼层
昨天跟你说了,先试试 $objWMIService.ExecQuery("Select * from Win32_SerialPort") ,不是 Win32_PNPEntity
没有重现错误的代码,谁都猜不到,只能瞎猜
 楼主| 发表于 2022-3-12 15:47:58 | 显示全部楼层
afan 发表于 2022-3-12 15:01
昨天跟你说了,先试试 $objWMIService.ExecQuery("Select * from Win32_SerialPort") ,不是 Win32_PNPEnti ...

嗯嗯  A大我昨晚 试了的  
$colBios = $objWMIService.ExecQuery("Select * from Win32_SerialPort")
$colBios = $objWMIService^ ERROR
发表于 2022-3-12 16:32:36 | 显示全部楼层
始终没看到你的问题代码,罢了。
最后再帮你补一刀:
如果你是添加到 WM_DEVICECHANGE 系统消息中直接执行的,那肯定不行。消息还未传递,类似处于“挂起”状态,你可以做出适当的标记在其它处处理或使用各种延后执行方式,系统消息都是必须尽快返回。

BTW, 硬件信息一般都可以在注册表中获取,快如闪电。WMI是最慢的。

评分

参与人数 1金钱 +40 收起 理由
itzyx + 40 谢谢A大 指导

查看全部评分

 楼主| 发表于 2022-3-12 16:51:15 | 显示全部楼层
本帖最后由 itzyx 于 2022-3-12 17:02 编辑
afan 发表于 2022-3-12 16:32
始终没看到你的问题代码,罢了。
最后再帮你补一刀:
如果你是添加到 WM_DEVICECHANGE 系统消息中直接执 ...

A大我的问题 ,因为代码有点长,没发出来 ,想着常说的精简代码,对症下药 ,是我欠考虑了。。。
我的本意是想做个实时检测端口插入拔出的脚本,可以区分端口插入主机的顺序,然后记录对应设备的编号批量打开软件,现在其他功能都已经实现了,就差这个端口全名的问题了,因为有的设备插入 会有两个端口号,显示全名我才能知道剔除哪个端口不用,下面是代码(编辑一下 ,少了一段代码,不过问题就出在截止的代码行那里,我插入设备之后就报错了):
#include <GuiListView.au3>
#include <Editconstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <ARRAY.au3>

Global $ListView_HitItem, $Listview_HitItemIndex, $Listview_HitItemSubItem, $ListView_HitItemInput,$Portnames;定义全局变量

Global Const $DBT_DEVICEARRIVAL = 0x8000 ;设备插入
Global Const $DBT_DEVICEREMOVECOMPLETE = 0x8004 ;设备移除
Global Const $DBT_DEVTYP_PORT = 0x00000003

$Form = GUICreate("端口读取工具",820, 450)
$Button=GUICtrlCreateButton('OK',727,412,80,30,-1,$WS_EX_WINDOWEDGE)
GUICtrlCreateLabel("BY-Lay  Version1.0.1", 8, 420,200,40)
Local $sFont = "宋体"
GUICtrlSetFont(-1,10, 100, 2, $sFont)
GUICtrlSetState(-1,128)
GUISetFont(9, 400, 0, "微软雅黑")
$Combox=GUICtrlCreateCombo('',620,415,80,30)
GUICtrlSetTip($Combox,'选择已有的快捷方式名称,或者手动粘贴需要打开软件的路径','提示',1,1)
$Check=GUICtrlCreateCheckbox('',600,415,15,30)
GUICtrlSetTip($Check,'勾选复选框,根据端口数量打开对应软件窗口数量','提示',1,1)
GUICtrlSetData($Combox, 'QGNSS|PowerGPS|TTFF_Tester','QGNSS')
$ListView = GUICtrlCreateListView("序列(List)|端口(Port)|模块编号(ModuleId)", 8, 8, 800, 400)
GUICtrlSendMsg($ListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES);扩展风格
$label = GUICtrlCreateLabel("", -100, -100, 1, 1)
GUISetState(@SW_SHOW)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 0, 100)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 1, 500)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 2, 195)

Local $Ports=''
$objWMIService = objget("WinMgmts:")
$colBios = $objWMIService.ExecQuery("Select * from  Win32_PNPEntity")
For $object in $colBios
  $Ports &= StringMid($object.Caption,1)& @CRLF
Next
$Bports = StringRegExp($Ports,'(?m).+\(COM\d+\)$', 3)

If UBound($Bports)<1 Then
Sleep(50)
Else
For $i = 1 To UBound($Bports)
        GUICtrlCreateListViewItem( $i &'|'&$Bports[$i-1]& "|", $ListView)
Next
EndIf


GUIRegisterMsg($WM_DEVICECHANGE, 'My_Message_Test')
GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")
GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")


Func My_Message_Test($hWnd, $Msg, $wParam, $lParam)
        Switch $wParam
                        Case $DBT_DEVICEARRIVAL
                                Local $dbhdr = DllStructCreate('DWORD size;DWORD devicetype;DWORD reserved', $LParam)
                                If DllStructGetData($dbhdr, "devicetype") = $DBT_DEVTYP_PORT Then
                                        Local $dbport = DllStructCreate('DWORD size;DWORD devicetype;DWORD reserved;wchar name[128]', $LParam)
                                        $Portnames=DllStructGetData($dbport, 'name')
                                        $WMIService = objget("WinMgmts:")
                                        $colBios = $WMIService.ExecQuery("Select * from Win32_SerialPort")
 楼主| 发表于 2022-3-12 16:53:24 | 显示全部楼层
afan 发表于 2022-3-12 16:32
始终没看到你的问题代码,罢了。
最后再帮你补一刀:
如果你是添加到 WM_DEVICECHANGE 系统消息中直接执 ...

我的问题  应该就是A大你说的“ 添加到 WM_DEVICECHANGE 系统消息中直接执行的 ” 我来想想办法解决
发表于 2022-3-12 19:05:41 | 显示全部楼层
我能插嘴吗
 楼主| 发表于 2022-3-12 19:31:40 | 显示全部楼层

怎么听起来怪怪的 ,发哥你评论必须可以的。。。
发表于 2022-3-12 19:33:34 | 显示全部楼层
itzyx 发表于 2022-3-12 19:31
怎么听起来怪怪的 ,发哥你评论必须可以的。。。

那就插一下嘴
GUICreate("", 400, 150)
GUISetState()
Global $mCom[]
Local $objWMIService = ObjGet("WinMgmts:")
Local $PNPEntity = $objWMIService.ExecQuery("Select * from  Win32_PNPEntity")
For $object In $PNPEntity
        If StringInStr($object.Caption, '(COM') Then
                Local $A = StringRegExp($object.Caption, '(COM\d+)', 3)
                If IsArray($A) Then $mCom[$A[0]] = $object.Caption
        EndIf
Next
GUIRegisterMsg(0x0219, "_DEVCHANGE")
Do
Until GUIGetMsg() = -3 

Func _DEVCHANGE($hWnd, $Msg, $wParam, $lParam)
        Switch $wParam
                Case 0x8000, 0x8004
                        Local $tBuf = DllStructCreate('DWORD;DWORD devicetype;DWORD;wchar name[128]', $lParam)
                        If DllStructGetData($tBuf, "devicetype") = 3 Then MsgBox(0, '', $mCom[DllStructGetData($tBuf, 'name')])
        EndSwitch
EndFunc   ;==>_DEVCHANGE
发表于 2022-3-12 19:47:40 | 显示全部楼层

介个貌似得先把所有设备先插进去再运行
.13 .15 beta版、.16正式版才能运行Maps,我.14没测试,猜的
发表于 2022-3-12 19:51:53 | 显示全部楼层
afan 发表于 2022-3-12 19:47
介个貌似得先把所有设备先插进去再运行
.13 .15 beta版、.16正式版才能运行Maps,我.14没测试,猜的
:f ...

没改他的逻辑,只添加了一个map而已。14.0以后的版本我就没用过,13.xx可以用。
 楼主| 发表于 2022-3-12 19:58:51 | 显示全部楼层

运行报错了  Global $mCom[^ ERROR
不过我看了一下 发哥你这代码,就像A大说的,需要把所有设备插进去 才运行吧,不然还是获取不到设备名称。
发表于 2022-3-12 20:03:28 | 显示全部楼层
itzyx 发表于 2022-3-12 19:58
运行报错了  Global $mCom[^ ERROR
不过我看了一下 发哥你这代码,就像A大说的,需要把所有设备插进去  ...

发表于 2022-3-12 22:15:32 | 显示全部楼层
我也插个嘴,这个问题处理下com错误就行了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-3 20:27 , Processed in 0.077963 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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