Usb don';禁用某些设备时,无法获取u InstanceOperationEvent

Usb don';禁用某些设备时,无法获取u InstanceOperationEvent,usb,wmi,vbscript,Usb,Wmi,Vbscript,我想在插入/删除/启用/禁用usb设备时收到通知。 我正在为注册“InstanceOperationEvent” 问题是,尽管我收到了所有设备的插入/删除通知。 我仅为USB存储设备获取启用/禁用事件 我做错了什么 提前感谢如果不提供代码示例或不告诉我们您使用的是哪种语言,就有点难以理解您所说的内容 Win32_USBController类是Win32_PnPEntity类的一个关联器,它有一个所有USB设备的实例,无论其类型如何。因此,此类的\uu InstanceOperationEvent

我想在插入/删除/启用/禁用usb设备时收到通知。 我正在为注册“InstanceOperationEvent”

问题是,尽管我收到了所有设备的插入/删除通知。 我仅为USB存储设备获取启用/禁用事件

我做错了什么


提前感谢

如果不提供代码示例或不告诉我们您使用的是哪种语言,就有点难以理解您所说的内容

Win32_USBController
类是Win32_PnPEntity类的一个关联器,它有一个所有USB设备的实例,无论其类型如何。因此,此类的
\uu InstanceOperationEvent
确实为所有设备提供通知,而不仅仅是USB存储设备。更合适的是,它适用于任何PnP兼容的USB设备

以下脚本是用VBScript编写的概念点。当设备连接或断开时,它将通知您所有USB组件。我测试了USB存储设备、USB鼠标和键盘,以及我身边的各种其他设备。他们都工作了。我在Vista x64上进行了测试,但这应该适用于任何版本的Windows

样本:

确定设备何时启用或禁用是类似的,但有一些明显的区别。您需要使用
Win32_PnPEntity
类,它基本上是所有已安装PnP设备的枚举。您需要关注每个实例的
configmanagerrorcode
属性。这提供了与设备管理器的设备状态部分相同的信息。您可以看到,对于任何给定的设备,观察此属性将非常有用。当设备更改为显示正常操作的代码(0)时,我们可以安全地假设设备已启用。当此代码更改为代码22时,我们知道设备已被禁用。(所有其他代码表示错误状态。)
\u InstanceModificationEvent
是监视
Win32_pPentity
类的任何实例中的更改的良好选择

如果您对可能的错误代码感兴趣,可以在脚本开头附近插入一个
WScript.Echo
语句,在该语句中枚举所有可能的值

样本:


Win32_PnPEntity确实适用于我的USB指纹扫描仪设备它不会选择未安装驱动程序的设备的事件。我给我的代码,以及可能有一些问题,我的代码

static void Main(string[] args)
    {
        WqlEventQuery weqQuery = new WqlEventQuery();
        weqQuery.EventClassName = "__InstanceOperationEvent";
        weqQuery.WithinInterval = new TimeSpan(0, 0, 3);
        weqQuery.Condition = @"TargetInstance ISA 'Win32_PnPEntity'";

        ManagementEventWatcher m_mewWatcher = new ManagementEventWatcher(weqQuery);
        m_mewWatcher.EventArrived += new EventArrivedEventHandler(m_mewWatcher_EventArrived);

        m_mewWatcher.Start();
        m_mewWatcher1.Start();
        Console.ReadLine();
    }
    static void m_mewWatcher_EventArrived(object sender, EventArrivedEventArgs e)
    {

        bool bUSBEvent = false;

        foreach (PropertyData pdData in e.NewEvent.Properties)
        {
            try
            {
                ManagementBaseObject mbo = (ManagementBaseObject)pdData.Value;
                if (mbo != null)
                {
                    foreach (PropertyData pdDataSub in mbo.Properties)
                    {
                        Console.WriteLine("pdDataSub.Name= " + pdDataSub.Name + " and pdDataSub.Value.ToString() = " + (pdDataSub.Value == null ? "" : pdDataSub.Value));
                    }
                }
            }
            catch (Exception ex)
            {
            }
        }
    }

谢谢你的回答!我确实收到了所有usb插入/删除的通知。但是对于某些设备,当它们被禁用/启用时,我没有得到事件。@user844541您的意思是在不删除设备的情况下启用/禁用它们吗?你能给我举个装置的例子吗?我不确定我是否理解你的意思。让我们以贝尔金无线网络适配器为例。当设备被插入时,我得到一个事件,并用它做我需要的任何事情。但是,如果设备被禁用,然后用户通过设备管理器启用了它,我不会得到任何事件。我明白你的意思。这是因为你没有注册正确的活动。即使设备处于“禁用”状态,它仍处于连接状态。让我看看是否可以为它确定正确的事件。@user844541好的,我已经解决了。我已经在上面的帖子中添加了相关代码。谢谢!我想看看。
Const wbemFlagUseAmendedQualifiers = &H20000

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set objPnPEntityClass = objWMIService.Get("Win32_PnPEntity", wbemFlagUseAmendedQualifiers)
arrValues = objPnPEntityClass.properties_("ConfigManagerErrorCode").qualifiers_("values")
valueMap = objPnPEntityClass.properties_("ConfigManagerErrorCode").qualifiers_("valuemap")

WScript.Echo "Gathering Device Manager error codes..."
Set dictErrorCodes = CreateObject("Scripting.Dictionary")
For i = 0 to Ubound(arrValues)
    dictErrorCodes.add valueMap(i), arrValues(i)
    '  0, This device is working properly.
    ' 22, This device is disabled.
Next

Set objPnPEntityClass = Nothing

WScript.Echo "Setting up event notification..."
Set colEvents = objWMIService.ExecNotificationQuery _
    ("Select * From __InstanceModificationEvent Within 1 " _
        & "Where TargetInstance Isa 'Win32_PnPEntity'")

WScript.Echo "Waiting..."
While True
    Set objEvent = colEvents.NextEvent
    Set objDevice = objEvent.TargetInstance

    Select Case objDevice.ConfigManagerErrorCode
    Case 0      ' This device is working properly.
        strOutput = objDevice.Caption & " is working properly." & vbCr
    Case 22     ' This device is disabled.
        strOutput = objDevice.Caption & " has been disabled." & vbCr
    Case Default
        strDeviceStatus = arrValues(objDevice.ConfigManagerErrorCode)
        strOutput = "(" & objDevice.Caption & ") " &  strDeviceStatus & vbCr
    End Select

    WScript.Echo strOutput
Wend
static void Main(string[] args)
    {
        WqlEventQuery weqQuery = new WqlEventQuery();
        weqQuery.EventClassName = "__InstanceOperationEvent";
        weqQuery.WithinInterval = new TimeSpan(0, 0, 3);
        weqQuery.Condition = @"TargetInstance ISA 'Win32_PnPEntity'";

        ManagementEventWatcher m_mewWatcher = new ManagementEventWatcher(weqQuery);
        m_mewWatcher.EventArrived += new EventArrivedEventHandler(m_mewWatcher_EventArrived);

        m_mewWatcher.Start();
        m_mewWatcher1.Start();
        Console.ReadLine();
    }
    static void m_mewWatcher_EventArrived(object sender, EventArrivedEventArgs e)
    {

        bool bUSBEvent = false;

        foreach (PropertyData pdData in e.NewEvent.Properties)
        {
            try
            {
                ManagementBaseObject mbo = (ManagementBaseObject)pdData.Value;
                if (mbo != null)
                {
                    foreach (PropertyData pdDataSub in mbo.Properties)
                    {
                        Console.WriteLine("pdDataSub.Name= " + pdDataSub.Name + " and pdDataSub.Value.ToString() = " + (pdDataSub.Value == null ? "" : pdDataSub.Value));
                    }
                }
            }
            catch (Exception ex)
            {
            }
        }
    }