gpt4 book ai didi

c# - 使用 WMI 识别哪个设备导致了 Win32_DeviceChangeEvent

转载 作者:可可西里 更新时间:2023-11-01 09:03:23 24 4
gpt4 key购买 nike

我一直在编写一些代码来检测 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 子句),瞧!我得到了创建的特定设备。

关于我的原始查询“从 Win32_DeviceChangeEvent 中选择 *”如何对任何人都有用,这仍然让我感到困惑,因为在触发通用事件通知后没有提供其他信息。无论哪种方式,这个新查询都是解决我的问题的更清晰的解决方案。 WMI 似乎非常强大,但找到要使用的正确查询可能很棘手,需要进行一些试验。

关于c# - 使用 WMI 识别哪个设备导致了 Win32_DeviceChangeEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5278860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com