使用WqlEventQuery检测插入的USB设备,并检索其描述性信息
本文关键字:检索 描述性 信息 设备 检测 WqlEventQuery 插入 USB 使用 | 更新日期: 2023-09-27 18:22:04
我玩过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端口插入手机时。我想提取信息,说明这是来自特定生产商的特定型号的手机,等等
为了获得这些信息,我是否有意采取正确的行动?在这方面,我应该尝试一些不同的或更有效的方法吗?
谢谢!
尝试查看Win32_PnPEntity。我认为Win32_USBControllerdevice是一个"元级别"元素。
以下是查询:-在这种情况下,我们应该使用"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
{
}
}
}
我知道我参加聚会迟到了,但也许我的回答对某人有帮助。我不建议关注'__InstanceCreationEvent',尤其是在使用复杂查询的情况下。我在处理此类查询时遇到了非常糟糕的性能。不是我的应用程序很慢,但它导致电脑上的WMI服务在80%的cpu上运行。
我建议关注一些更简单的事件,如"Win32_DeviceChangeEvent",以检测要更改的USB设备。如果该事件被激发,则使用"ManagementObjectSearcher"类实际检查所需设备是否已连接。
如果您没有机会使用不同的Event,那么请尝试使用最小的必要范围并精确地定义查询。