3

我玩过 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 端口插入手机时。我想从特定的生产商那里提取表明特定型号的电话的信息,依此类推。

我是否正在做正确的事情来获取这些信息?在这方面我应该尝试不同或更有效的方法吗?

谢谢!

4

3 回答 3

3

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

于 2015-03-20T21:31:37.020 回答
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
        {
        }
    }
}
于 2018-05-26T09:52:37.407 回答
0

我知道我参加这个聚会迟到了,但也许我的回答对某人有帮助。我不建议观看“__InstanceCreationEvent”,尤其是在您使用复杂查询的情况下。我在这样的查询中遇到了非常糟糕的表现。不是我的应用程序很慢,而是它导致 pc 上的 WMI 服务在 80% 的 cpu 上运行。

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

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

于 2019-08-14T12:13:37.933 回答