baikaifang 发表于 2008-5-31 06:23:58

[已解决]如何识别设备管理器中的硬件设备,和打印机的状态

本帖最后由 baikaifang 于 2010-11-18 22:17 编辑

由于公司是做电脑周边设备的,大部分都是USB类的产品,所有的产品都是在WinXP里面进行测试,所有的产品接上电脑后,都可以在设备管理器中检测到,并且有一个固定的标识名称;和我们日常使用的U盘一样.

举个例子吧,公司有个产品叫做 USB 转 并口 ;也就是所谓的USB打印器.用在没有并口的主机上连接打印机的.测试过程是这样的. 首先-----将打印机和USB打印器的并口连接-->将USB打印器USB端插入主机(此时设备管理器里面会检测到USB打印器,同时在打印机管理里面也可以看到打印机已处于联机状态)-->在操作系统里发送打印任务-->打印机打印-->人工拔掉USB打印器(此时设备管理器里面USB打印器消失,同时打印机管理里面也可以看到打印机处于脱机状态)-->回到开始重复.

现在的问题是如何让AUTOIT程序自动检测USB打印器和打印机的状态,也就是说让AUTOIT程序处于待命状态,当设备管理器里面USB打印器检测到而且打印机也处于连机状态的时候,AUTOIT程序才开始执行其它操作.执行完成后再次检测打印器和打印机状态,即USB打印器已经拔掉.(此时设备管理器里USB打印器已检测不到,同时打印机也处于脱机状态),然后程序返回到开始的状态(待命状态).重复整个过程.

总结问题:其实就是让AUTOIT识别硬件设备和打印机的状态.

bing614 发表于 2008-6-7 08:51:00

devcon.exe 可以做到。
如查看COM口状态
devcon.exe status "ACPI\PNP0501"

a9038889 发表于 2009-11-19 13:09:52

...沒有比較好用的指令嗎?

pusofalse 发表于 2009-11-19 13:32:51

#include <SetupApi.au3>

Local $sDeviceID, $hDevInst, $iStatus, $sProblem, $sStatus

$sDeviceID = "ACPI\ACPI0003\2&DABA3FF&0"
$hDevInst = _CM_Locate_DevNode($sDeviceID)
$iStatus = _CM_Get_DevNode_Status($hDevInst)
$sProblem = _CM_Query_Device_Problem($hDevInst)

If bitAND($iStatus, 1) = 1 Then $sStatus &= "DN_ROOT_ENUMERATOR" & @LF
If bitAND($iStatus, 2) = 2 Then $sStatus &= "DN_DRIVER_LOADED" & @LF
If bitAND($iStatus, 4) = 4 Then $sStatus &= "DN_ENUM_LOADED" & @LF
If bitAND($iStatus, 8) = 8 Then $sStatus &= "DN_STARTED" & @LF
If bitAND($iStatus, 16) = 16 Then $sStatus &= "DN_MANUAL" & @LF
If bitAND($iStatus, 32) = 32 Then $sStatus &= "DN_NEED_TO_ENUM" & @LF
If bitAND($iStatus, 64) = 64 Then $sStatus &= "DN_NOT_FIRST_TIME" & @LF
If bitAND($iStatus, 128) = 128 Then $sStatus &= "DN_HARDWARE_ENUM" & @LF
If bitAND($iStatus, 256) = 256 Then $sStatus &= "DN_NEED_RESTART" & @LF
If bitAND($iStatus, 512) = 512 Then $sStatus &= "DN_HAS_MARK" & @LF
If bitAND($iStatus, 1024) = 1024 Then $sStatus &= "DN_HAS_PROBLEM" & @LF
If bitAND($iStatus, 2048) = 2048 Then $sStatus &= "DN_FILTERED" & @LF
If bitAND($iStatus, 4096) = 4096 Then $sStatus &= "DN_MOVED" & @LF
If bitAND($iStatus, 0x2000) = 0x2000 Then $sStatus &= "DN_DISABLEABLE" & @LF
If bitAND($iStatus, 0x4000) = 0x4000 Then $sStatus &= "DN_REMOVABLE" & @LF
If bitAND($iStatus, 0x8000) = 0x8000 Then $sStatus &= "DN_PRIVATE_PROBLEM" & @LF
If bitAND($iStatus, 0x10000) = 0x10000 Then $sStatus &= "DN_MF_PARENT" & @LF
If bitAND($iStatus, 0x20000) = 0x20000 Then $sStatus &= "DN_MF_CHILD" & @LF
If bitAND($iStatus, 0x40000) = 0x40000 Then $sStatus &= "DN_WILL_BE_REMOVED" & @LF
If bitAND($iStatus, 0x80000) = 0x80000 Then $sStatus &= "DN_NOT_FIRST_TIMEE" & @LF
If bitAND($iStatus, 0x100000) = 0x100000 Then $sStatus &= "DN_STOP_FREE_RES" & @LF
If bitAND($iStatus, 0x200000) = 0x200000 Then $sStatus &= "DN_REBAL_CANDIDATE" & @LF
If bitAND($iStatus, 0x400000) = 0x400000 Then $sStatus &= "DN_BAD_PARTIAL" & @LF
If bitAND($iStatus, 0x800000) = 0x800000 Then $sStatus &= "DN_NT_ENUMERATOR" & @LF
If bitAND($iStatus, 0x1000000) = 0x1000000 Then $sStatus &= "DN_NT_DRIVER" & @LF
If bitAND($iStatus, 0x2000000) = 0x2000000 Then $sStatus &= "DN_NEEDS_LOCKING" & @LF
If bitAND($iStatus, 0x4000000) = 0x4000000 Then $sStatus &= "DN_ARM_WAKEUP" & @LF
If bitAND($iStatus, 0x8000000) = 0x8000000 Then $sStatus &= "DN_APM_ENUMERATOR"&@LF
If bitAND($iStatus, 0x10000000) = 0x10000000 Then $sStatus &= "DN_APM_DRIVER" & @LF
If bitAND($iStatus, 0x20000000) = 0x20000000 Then $sStatus &= "DN_SILENT_INSTALL" & @LF
If bitAND($iStatus, 0x40000000) = 0x40000000 Then $sStatus &= "DN_NO_SHOW_IN_DM" & @LF
If bitAND($iStatus, 0x80000000) = 0x80000000 Then $sStatus &= "DN_BOOT_LOG_PROB" & @LF

Msgbox(0, $sDeviceID, $sStatus & @LF & $sProblem)

r437984177 发表于 2014-10-22 23:44:11

学习学习!!!!!!!!!
页: [1]
查看完整版本: [已解决]如何识别设备管理器中的硬件设备,和打印机的状态