加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用WMI来识别哪个设备导致Win32_DeviceChangeEvent

发布时间:2020-12-15 07:39:05 所属栏目:百科 来源:网络整理
导读:我一直在编写一些代码来检测USB设备的添加和删除,并且我已经使用以下WMI代码来注册设备更改通知: watcher = new ManagementEventWatcher(query);watcher.EventArrived += new EventArrivedEventHandler(DeviceChangeEventReceived);watcher.Start(); 这是处
我一直在编写一些代码来检测USB设备的添加和删除,并且我已经使用以下WMI代码来注册设备更改通知:
watcher = new ManagementEventWatcher(query);
watcher.EventArrived += new EventArrivedEventHandler(DeviceChangeEventReceived);
watcher.Start();

这是处理程序代码:

void DeviceChangeEventReceived(object sender,EventArrivedEventArgs e)
{
   foreach (PropertyData pd in e.NewEvent.Properties)
   {
      Log.Debug("t" + pd.Name + ":" + pd.Value + "t" + pd.Value.GetType());
   }
}

这是非常好的,它适用于我插入或从系统中删除的任何USB设备.我遇到的问题是,如何识别出具体导致事件的设备?

在我的程序的其他地方,我保留了我最感兴趣的当前连接的设备的列表,所以如果设备移除事件通过,我可以使用“select * from Win32_PnPEntity”或其他一些WMI检查该列表类似查询.但是,这是一种非常不准确和麻烦的方式来识别被删除的设备.另外一个问题是,我没有办法准确地告诉什么设备被添加,除非我提前提交Win32_PnPEntity的整个列表,并做真正疯狂的比较/验证.

我在这里缺少一些明显的东西吗?如何将设备更改事件与特定设备相关联?

更新:我还没有想到这个问题的理想解决方案,但是我正在做的是在内存中维护一个当前连接的设备列表(我感兴趣的),每次处理一个事件(见以上),我查询Win32_PnPEntity以查看我已连接设备列表中存储的设备是否仍然连接.这是一个次优解决方案,因为看起来很奇怪,我无法从指示“设备更改事件”的事件中获取任何特定的设备标识信息.似乎非常奇怪,这个信息是不可用的.叹

解决方法

好的,经过一些进一步的调查和实验,我发现我需要使用一个不同的WMI查询来解决我的问题,即将设备更改事件与特定设备相关联.在这种情况下,我需要找到在WMI中通常被称为“TargetInstance”的内容.

所以,我使用了以下WMI查询代码

ManagementEventWatcher watcher;
            string queryStr =
                "SELECT * FROM __InstanceCreationEvent " +
                "WITHIN 2 "
              + "WHERE TargetInstance ISA 'Win32_PnPEntity'"

            watcher = new ManagementEventWatcher(queryStr);
            watcher.EventArrived += new EventArrivedEventHandler(DeviceChangeEventReceived);
            watcher.Start();

所以这里的区别是,__InstanceCreationEvent有一个名为“TargetInstance”的属性,这是我正在寻找的.我将TargetInstance属性转换为一个ManagementBaSEObject(其类型为“Win32_PnPEntity”(根据上面的查询中的ISA子句),而Voila!我获取了创建的特定设备.

关于我的原始查询“Select * from Win32_DeviceChangeEvent”对任何人来说都是有用的,因为在通用事件通知被触发之后没有提供任何附加信息,它仍然令人困惑.无论哪种方式,这个新的查询对我的问题都是一个非常清晰的解决方案. WMI似乎很强大,但找到使用正确的查询可能很棘手,需要一些实验.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读