可以全部监听。好用
private void FormF100WriteCortexLicense_Load(object sender, EventArgs e){this.Text = this.Text + " " + FT_Tools.Program.version;USB USBWatcher = new USB();USBWatcher.AddUSBEventWatcher(USBEventHandler, USBEventHandler, new TimeSpan(0, 0, 1));}private void USBEventHandler(Object sender, EventArrivedEventArgs e){//暂未实现var watcher = sender as ManagementEventWatcher;watcher.Stop();//刷新设备信息if (e.NewEvent.ClassPath.ClassName == "__InstanceCreationEvent"){Log("Device Arrived");}else if (e.NewEvent.ClassPath.ClassName == "__InstanceDeletionEvent"){Log("Device Removed");}// 业务代码,逻辑耗时尽量不要太长,以免影响事件的监听watcher.Start();}
以下可以部分监听
public const int WM_DEVICECHANGE = 0x219;public const int DBT_DEVICEARRIVAL = 0x8000;public const int DBT_CONFIGCHANGECANCELED = 0x0019;public const int DBT_CONFIGCHANGED = 0x0018;public const int DBT_CUSTOMEVENT = 0x8006;public const int DBT_DEVICEQUERYREMOVE = 0x8001;public const int DBT_DEVICEQUERYREMOVEFAILED = 0x8002;public const int DBT_DEVICEREMOVECOMPLETE = 0x8004;public const int DBT_DEVICEREMOVEPENDING = 0x8003;public const int DBT_DEVICETYPESPECIFIC = 0x8005;public const int DBT_DEVNODES_CHANGED = 0x0007;public const int DBT_QUERYCHANGECONFIG = 0x0017;public const int DBT_USERDEFINED = 0xFFFF;protected override void WndProc(ref Message m){try{if (m.Msg == WM_DEVICECHANGE){switch (m.WParam.ToInt32()){case WM_DEVICECHANGE:break;case DBT_DEVICEARRIVAL:MessageBox.Show("判断检测USB插入电脑");DriveInfo[] s = DriveInfo.GetDrives();foreach (DriveInfo drive in s){if (drive.DriveType == DriveType.Removable){break;}}break;case DBT_CONFIGCHANGECANCELED:break;case DBT_CONFIGCHANGED:break;case DBT_CUSTOMEVENT:break;case DBT_DEVICEQUERYREMOVE:break;case DBT_DEVICEQUERYREMOVEFAILED:break;case DBT_DEVICEREMOVECOMPLETE:MessageBox.Show("判断检测USB拔出电脑");break;case DBT_DEVICEREMOVEPENDING:break;case DBT_DEVICETYPESPECIFIC:break;case DBT_DEVNODES_CHANGED:break;case DBT_QUERYCHANGECONFIG:break;case DBT_USERDEFINED:break;default:break;}}}catch (Exception ex){MessageBox.Show(ex.Message);}base.WndProc(ref m);}
以下不行
public class USBWatcher{private MyAPI.MyDel Log;private ManagementEventWatcher watcher;public USBWatcher(MyAPI.MyDel Log){this.Log= Log;}public void StartWatcher(){// 查询USB插入事件WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2");// 创建事件监听器watcher = new ManagementEventWatcher(query);watcher.EventArrived += OnUSBInserted;// 开始监听watcher.Start();}public void StopWatcher(){// 停止监听if (watcher != null){watcher.Stop();watcher.Dispose();}}private void OnUSBInserted(object sender, EventArrivedEventArgs e){// 处理USB插入事件Log?.Invoke("USBInserted");}}