我是C# 编程的新手,我正在处理这样的场景:
我有一个 Winform,其中 WndProc 方法被覆盖为:
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == USBNotification.WmDevicechange)
{
switch ((int)m.WParam)
{
case DEVICE_REMOVE:
DEV_BROADCAST_VOLUME vol =(DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME));
Usb_DeviceRemoved();
break;
case DEVICE_ADDITION:
DEV_BROADCAST_VOLUME vol2 = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME));
Usb_DeviceAdded();
break;
}
}
}
所以基本上我的表格正在收到有关设备添加和删除的通知
在“ Usb_DeviceRemoved()
”中,我检查我的相关设备是否已被删除(WMI 查询)并运行一些代码(基本上在代码中设置一些设备不再存在的变量)。
同样在 " Usb_DeviceAdded()
" 中,我检查是否添加了我的相关设备(WMI 查询)并激活该设备(一些代码)。
问题:假设 USB 设备被移除并且“ Usb_DeviceRemoved()
”被调用,现在正在执行“ Usb_DeviceRemoved()
”USB 设备被连接并且执行将跳转到“Usb_DeviceAdded()”。但我希望“ Usb_DeviceRemoved()
”一次执行。
PS:我的 winform 在主线程(STA)中运行,我希望一切都在同一个线程中完成
无论如何都可以原子地运行“ Usb_DeviceRemoved()
”和“ ”Usb_DeviceAdded()