相关疑难解决方法(0)

使用WMI识别导致Win32_DeviceChangeEvent的设备

我一直在编写一些检测USB设备添加和删除的代码,我使用以下WMI代码注册设备更改通知:

watcher = new ManagementEventWatcher(query);
watcher.EventArrived += new EventArrivedEventHandler(DeviceChangeEventReceived);
watcher.Start();
Run Code Online (Sandbox Code Playgroud)

这是处理程序代码:

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

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

在我的程序的其他地方,我保留了我最感兴趣的当前连接设备的列表,因此如果设备删除事件通过,我可以使用"select*from Win32_PnPEntity"或其他一些来检查WMI的列表类似的查询.但是,这是一种识别被移除设备的非常不准确且繁琐的方法.增加的问题是,我无法准确地告知添加了什么设备,除非我提前缓存整个Win32_PnPEntity列表,并进行真正疯狂的比较/验证.

我错过了一些明显的东西吗?如何将设备更改事件与特定设备相关联?

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

c# wmi

10
推荐指数
1
解决办法
6938
查看次数

标签 统计

c# ×1

wmi ×1