检测 C# 中的 USB 设备插入和移除

本文关键字:插入 中的 USB 检测 | 更新日期: 2023-09-27 18:30:51

我尝试了此线程中的解决方案之一 使用 Windows 服务和 C# 检测 USB 驱动器的插入和移除。 但是由于对Windows窗体控件的线程不安全调用,我仍然收到错误。

这是我的代码

private void initWatchers()
{
    WqlEventQuery insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");
    ManagementEventWatcher insertWatcher = new ManagementEventWatcher(insertQuery);
    insertWatcher.EventArrived += new EventArrivedEventHandler(DeviceInsertedEvent);
    insertWatcher.Start();
    WqlEventQuery removeQuery = new WqlEventQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");
    ManagementEventWatcher removeWatcher = new ManagementEventWatcher(removeQuery);
    removeWatcher.EventArrived += new EventArrivedEventHandler(DeviceRemovedEvent);
    removeWatcher.Start();
}

在事件处理程序中,我启动了后台工作线程

private void DeviceInsertedEvent(object sender, EventArrivedEventArgs e)
{ 
  this.backgroundWorker1.RunWorkerAsync();
}
void DeviceRemovedEvent(object sender, EventArrivedEventArgs e)
{
 this.backgroundWorker1.RunWorkerAsync();
}

后台工作线程完成后,我确实访问了Windows窗体中的控件

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// access some controls of my windows form
}

所以现在由于控件的不安全调用,我仍然收到错误。 知道为什么吗?

检测 C# 中的 USB 设备插入和移除

这是因为 GUI 元素位于应用程序的 GUI 线程中,并且您正在尝试从 BackGroundWorker 线程访问它们。必须使用委托来处理后台工作线程中的 GUI 元素。例如:

    GUIobject.Dispatcher.BeginInvoke(
        (Action)(() => { string value = myTextBox.Text; }));

在 RunWorkerDone 上,您仍在尝试从 BackGroundWorker 访问 GUI 元素。