检测 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
}
所以现在由于控件的不安全调用,我仍然收到错误。 知道为什么吗?
这是因为 GUI 元素位于应用程序的 GUI 线程中,并且您正在尝试从 BackGroundWorker 线程访问它们。必须使用委托来处理后台工作线程中的 GUI 元素。例如:
GUIobject.Dispatcher.BeginInvoke(
(Action)(() => { string value = myTextBox.Text; }));
在 RunWorkerDone 上,您仍在尝试从 BackGroundWorker 访问 GUI 元素。