C# 使用WqlEventQuery检测插入的USB设备并检索其说明信息

C# 使用WqlEventQuery检测插入的USB设备并检索其说明信息,c#,windows,usb,plug-and-play,C#,Windows,Usb,Plug And Play,我一直在玩WqlEventQuery,目的是识别插入USB的设备 var query = new WqlEventQuery(); query.EventClassName = "__InstanceOperationEvent"; query.WithinInterval = new TimeSpan(0, 0, 2); query.Condition = @"TargetInstance ISA 'Win32_USBControllerdevice'"; using (var watche

我一直在玩WqlEventQuery,目的是识别插入USB的设备

var query = new WqlEventQuery();
query.EventClassName = "__InstanceOperationEvent";
query.WithinInterval = new TimeSpan(0, 0, 2);
query.Condition = @"TargetInstance ISA 'Win32_USBControllerdevice'";

using (var watcher = new ManagementEventWatcher(query))
{
   watcher.EventArrived += WatcherEvent;
   watcher.Start();

   ... Wait condition ...

   watcher.Stop();
}
然后,我尝试在watcher事件处理程序中查找设备属性

    foreach (var mbo in e.NewEvent.Properties.Cast<PropertyData>().Where(i => i.Value != null && i.Value is ManagementBaseObject).Select(pdData => (ManagementBaseObject)pdData.Value).Where(mbo => mbo != null))
    {
       if (mbo.ClassPath.ClassName == "Win32_USBControllerDevice")
       {
           foreach (var prop in mbo.SystemProperties)
           {
               ... look for the property content
           }
       }
    }
foreach(e.NewEvent.Properties.Cast()中的var mbo,其中(i=>i.Value!=null和&i.Value为ManagementBaseObject)。选择(pdData=>(ManagementBaseObject)pdData.Value)。其中(mbo=>mbo!=null))
{
if(mbo.ClassPath.ClassName==“Win32\u USBControllerDevice”)
{
foreach(mbo.SystemProperties中的var prop)
{
…查找属性内容
}
}
}
但找不到一个地方,我可以提取有关插入设备的信息。因此,当我通过USB端口插入电话时。我想从特定的生产商那里提取信息,说明这是一款特定型号的手机,以此类推

为了得到这些信息,我是在做正确的事情吗?在这方面,我应该尝试一些不同的或更有效的方法吗


谢谢

尝试查看Win32_Pentity。我相信Win32_USBControllerdevice是一个“元级别”元素。

以下是问题:-在这种情况下,我们应该使用“Win32_PnPEntity”而不是USB:-

WqlEventQuery insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent  WITHIN 2 WHERE TargetInstance ISA 'Win32_PnPEntity'");

ManagementEventWatcher insertWatcher = new ManagementEventWatcher(insertQuery);
insertWatcher.EventArrived += new EventArrivedEventHandler(DeviceInsertedEvent);
                             
insertWatcher.Start();
           
insertWatcher.WaitForNextEvent();
这就是处理程序的样子:-

private void DeviceInsertedEvent(object sender, EventArrivedEventArgs e)
{
      
    ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"];

    foreach (var property in instance.Properties)
    {
        try
        {
            string name = property.Value.ToString();//name of your device
            string deviceId = instance.GetPropertyValue("PNPDeviceID").ToString();
            if (name == "something")
            {
                ....your code.....
            }
        }
        catch
        {
        }
    }
}

我知道这次聚会我迟到了,但也许我的回答对某人有帮助。 我不建议监视“\uu InstanceCreationEvent”,尤其是在使用复杂查询时。我体验到这种查询的性能非常糟糕。不是我的应用程序速度慢,而是它导致电脑上的WMI服务在80%的cpu上运行

我建议观看一些简单的事件,如“Win32_DeviceChangeEvent”,以检测要更改的USB设备。如果触发该事件,则使用“ManagementObjectSearcher”类实际检查所需设备是否已连接


如果您没有机会使用其他事件,那么请尝试使用最小的必要范围并精确定义查询

@NHKomaiha感谢您更正语法。