冰楓論壇

標題: [C#] 監控USB插拔 [打印本頁]

作者: whitefox    時間: 2023-6-20 23:17
標題: [C#] 監控USB插拔
方法一:
  1. public const int DBT_DEVICEQUERYREMOVEFAILED = 0x8002;
  2. public const int DBT_DEVICEREMOVECOMPLETE = 0x8004;
  3. public const int DBT_DEVICEREMOVEPENDING = 0x8003;
  4. public const int DBT_DEVICETYPESPECIFIC = 0x8005;
  5. public const int DBT_DEVNODES_CHANGED = 0x0007;
  6. public const int DBT_QUERYCHANGECONFIG = 0x0017;
  7. public const int DBT_USERDEFINED = 0xFFFF;

  8. // 雙擊滑鼠左鍵
  9. public const int WM_MOUSE_DOUBLE_CHICK = 0x0203;

  10. // USB 監控
  11. protected override void WndProc(ref System.Windows.Forms.Message m)
  12. {
  13.     try
  14.     {
  15.         if (m.Msg == WM_DEVICECHANGE)
  16.         {
  17.             switch (m.WParam.ToInt32())
  18.             {
  19.                 case WM_DEVICECHANGE:
  20.                     break;
  21.                 case DBT_DEVICEARRIVAL://USB IN
  22.                     DriveInfo[] s = DriveInfo.GetDrives();
  23.                     foreach (DriveInfo drive in s)
  24.                     {
  25.                         if (drive.DriveType == DriveType.Removable)
  26.                         {
  27.                             MessageBox.Show("U盤已插入,盤符為:" + drive.Name.ToString());
  28.                             break;
  29.                         }
  30.                     }
  31.                     break;
  32.                 case DBT_CONFIGCHANGECANCELED:
  33.                     break;
  34.                 case DBT_CONFIGCHANGED:
  35.                     break;
  36.                 case DBT_CUSTOMEVENT:
  37.                     break;
  38.                 case DBT_DEVICEQUERYREMOVE:
  39.                     break;
  40.                 case DBT_DEVICEQUERYREMOVEFAILED:
  41.                     break;
  42.                 case DBT_DEVICEREMOVECOMPLETE: //USB OUT
  43.                     MessageBox.Show("You Flash ....Bye");
  44.                     break;
  45.                 case DBT_DEVICEREMOVEPENDING:
  46.                     break;
  47.                 case DBT_DEVICETYPESPECIFIC:
  48.                     break;
  49.                 case DBT_DEVNODES_CHANGED:
  50.                     break;
  51.                 case DBT_QUERYCHANGECONFIG:
  52.                     break;
  53.                 case DBT_USERDEFINED:
  54.                     break;
  55.                 default:
  56.                     break;
  57.             }
  58.         }
  59.    
  60.         // Mouse
  61.         if (m.Msg == WM_MOUSE_DOUBLE_CHICK)
  62.         {
  63.             MessageBox.Show("別在雙擊滑鼠左鍵了!");
  64.         }

  65.     }
  66.     catch (Exception ex)
  67.     {
  68.         MessageBox.Show(ex.Message);
  69.     }
  70.     base.WndProc(ref m);
  71. }
複製代碼
方法二:
  1. using System.Management;

  2. ManagementEventWatcher mew = null;

  3. private void Form1_Load(object sender, EventArgs e)
  4. {
  5.     mew = new ManagementEventWatcher("SELECT * FROM __InstanceOperationEvent WITHIN 10 WHERE TargetInstance ISA \"Win32_DiskDrive\"");
  6.     mew.Start();
  7.     mew.EventArrived += new EventArrivedEventHandler(mew_go);
  8. }

  9. private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  10. {
  11.     mew.Stop();
  12. }

  13. private void mew_go(object sender, System.Management.EventArrivedEventArgs e)
  14. {
  15.     ManagementBaseObject newEvent = e.NewEvent, newEventTarget = (newEvent["TargetInstance"] as ManagementBaseObject);
  16.     if (newEventTarget["InterfaceType"].ToString() == "USB")
  17.     {
  18.         switch (newEvent.ClassPath.ClassName)
  19.         {
  20.             case "__InstanceCreationEvent":
  21.                 Listbox_text_Update(listBox1, Convert.ToString(newEventTarget["Caption"])+" 裝置已插入");
  22.                 break;
  23.             case "__InstanceDeletionEvent":
  24.                 Listbox_text_Update(listBox1, Convert.ToString(newEventTarget["Caption"])+" 裝置已退出");
  25.                 break;
  26.         }
  27.     }
  28. }

  29. public static void Listbox_text_Update(ListBox lbox, string s)
  30. {
  31.     if (lbox.InvokeRequired)
  32.     {
  33.         lbox.BeginInvoke(new MethodInvoker(() => Listbox_text_Update(lbox, s)));
  34.     }
  35.     else
  36.     {
  37.         lbox.Items.Add(s);
  38.     }
  39. }
複製代碼





歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓