【问题标题】:Cannot implement USB Detection in .NET Framework using WMI API无法使用 WMI API 在 .NET Framework 中实现 USB 检测
【发布时间】:2021-03-04 20:44:45
【问题描述】:
  • 我正在尝试实现以下链接中的代码:Detecting USB drive insertion and removal using windows service and c#
  • 我认为我遇到的问题是,当插入或移除设备时,后台线程没有通知我的主 UI 线程。我通过无法在我的用户控件中更新标签的内容来验证这一点。
  • 我在下面包含了我的源代码:
private void DeviceInsertedEvent(object sender, EventArrivedEventArgs e)
{
    ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
    foreach (var property in instance.Properties)
    {
        MessageBox.Show(property.Name + " = " + property.Value); // Dialog box appears as expected. 
        StatusMessage.Content = $"{property.Name} = {property.Value}";
    }
    StatusMessage.Content = "Removable Drive detected!"; //label content should be updated here, and for some reason it is not.
    bool isDriveRemoved = FindRemovableDrive(); //get the drive info
    if (isDriveRemoved || Count > 0)
    {
        Count = 0;
    }
    else
    {
        Count++;
    }
}

private void DeviceRemovedEvent(object sender, EventArrivedEventArgs e)
{
    ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
    foreach (var property in instance.Properties)
    {
        MessageBox.Show(property.Name + " = " + property.Value); // Dialog box appears as expected, but label is not updated. 
    }
    StatusMessage.Content = $"{property.Name} = {property.Value}";
    FileMenu.Items.Clear(); // the file menu should be getting cleared here. 
}

private void backgroundWorker1_DoWork(object sender, RoutedEventArgs e)
{
    WqlEventQuery insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");

    ManagementEventWatcher insertWatcher = new ManagementEventWatcher(insertQuery);
    insertWatcher.EventArrived += DeviceInsertedEvent;
    insertWatcher.Start();

    WqlEventQuery removeQuery = new WqlEventQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");
    ManagementEventWatcher removeWatcher = new ManagementEventWatcher(removeQuery);
    removeWatcher.EventArrived += DeviceRemovedEvent;
    removeWatcher.Start();

    // Do something while waiting for events
    //Thread.Sleep(10000);
}

-任何输入/解决方案将不胜感激。

感谢您的宝贵时间,

迈克尔

【问题讨论】:

  • 我为源代码的格式道歉,我是新来这里发布问题。
  • 您最好使用 WMI 事件来检测设备添加/删除。并且要么过滤事件(需要知道设备ID之类的东西),要么然后枚举。 (目前不能做例子:源代码不在手上。)

标签: c# .net wpf wmi


【解决方案1】:

您可以使用 WMI 事件在发生硬件更改时收到通知,而不是定期扫描设备。

为即插即用事件启动监听器:

var wmiPath = new ManagementPath(@"root\cimv2");
var scope = new ManagementScope(wmiPath);
scope.Connect();
var instanceQuery = new WqlEventQuery("__InstanceOperationEvent",
                                        new TimeSpan(0, 0, 1),
                                        "TargetInstance isa \"Win32_PnPEntity\"");
wmiWatcher = new ManagementEventWatcher(scope, instanceQuery);
wmiWatcher.EventArrived += OnInstanceEvent;
wmiWatcher.Start();

事件处理程序:

private void OnInstanceEvent(object sender, EventArrivedEventArgs ea) {
  var eventType = (string)ea.NewEvent["__CLASS"];
  var targetWmiObj = ea.NewEvent["TargetInstance"] as ManagementBaseObject;
  var deviceId = (string)targetWmiObj["deviceId"];

 if (String.Equals("__InstanceCreationEvent", (string)ea.NewEvent["__CLASS"], StringComparison.Ordinal)) {
   if (/* Filter on the device id for what is interesting here*/) {
     // Handle relevant device arriving
    }
  }
}

对于其他事件类型(包括设备移除),还有其他 NewEvent["__CLASS"] 值。

PS。这是来自 WinForms 应用程序的(部分)代码,该应用程序监视正在插入的专用设备,然后从中下载/上传数据。所有工作都在线程池中完成:这里的一切都应该在 WPF 下工作。

【讨论】:

  • 谢谢理查德,我会试试这个。
  • 嗨,Richard,我无法消除 IntelliSense 为 wmiWatcher 提供的错误。我已将您添加的代码放在用户控件中,如下所示:
  • 表示当前上下文中不存在 wmiWatcher。关于如何解决这个问题的任何想法?
  • 没关系,我修好了。我添加了私有 ManagementEventWatcher wmiWatcher;在班级层面。
  • 我能够在移除 USB 时显示 MessageBox,但我仍然无法使用“FileMenu.Items.Clear();”从文件菜单 (ListBox) 中清除所有项目; .我正在调用 ClearFileMenu();来自 Richard 提供的 OnInstanceEvent 方法。关于从这里去哪里的任何想法?我只想在删除驱动器时清除列表框,并在插入驱动器时重新填充它。我目前无法做到这一点。
猜你喜欢
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多