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

2024-01-02

我尝试了该线程中的解决方案之一使用 Windows 服务和 C# 检测 USB 驱动器的插入和移除 https://stackoverflow.com/questions/620144/detecting-usb-drive-insertion-and-removal-using-windows-service-and-c-sharp/26973986#26973986。但由于对 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
}

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


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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中检测 USB 设备的插入和移除 的相关文章

随机推荐