使用WqlEventQuery检测插入的USB设备并检索其描述性信息

时间:2014-09-16 09:06:31

标签: 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 watcher = new ManagementEventWatcher(query))
{
   watcher.EventArrived += WatcherEvent;
   watcher.Start();

   ... Wait condition ...

   watcher.Stop();
}

然后我试图在观察者事件处理程序

中查找设备属性
    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
           }
       }
    }

但找不到我可以提取有关插入设备的信息的地方。所以,当我通过USB端口插入手机时。我想从特定的制作人那里提取说明特定模型电话的信息,等等。

我是否正在寻找正确的信息以获取此信息?我应该在这方面尝试不同或更有效的方法吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

尝试查看Win32_PnPEntity。我相信Win32_USBController设备是一个&#34;元级别&#34;元件。

答案 1 :(得分:1)

以下是查询: - 在这种情况下我们应该使用'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
     {
     }
 }

 }

答案 2 :(得分:0)

我知道我这次聚会迟到了,但也许我的回答对某人有帮助。 我不建议关注'__InstanceCreationEvent',尤其是在使用复杂查询的情况下。这样的查询我的表现真的很差。不是我的应用程序运行缓慢,但是导致PC上的WMI服务在80%的CPU上运行。

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

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