0

我是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()

4

0 回答 0