whitefox 發表於 2023-6-20 23:17:48

[C#] 監控USB插拔

方法一: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;

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

// USB 監控
protected override void WndProc(ref System.Windows.Forms.Message m)
{
    try
    {
        if (m.Msg == WM_DEVICECHANGE)
        {
            switch (m.WParam.ToInt32())
            {
                case WM_DEVICECHANGE:
                    break;
                case DBT_DEVICEARRIVAL://USB IN
                    DriveInfo[] s = DriveInfo.GetDrives();
                    foreach (DriveInfo drive in s)
                    {
                        if (drive.DriveType == DriveType.Removable)
                        {
                            MessageBox.Show("U盤已插入,盤符為:" + drive.Name.ToString());
                            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: //USB OUT
                    MessageBox.Show("You Flash ....Bye");
                    break;
                case DBT_DEVICEREMOVEPENDING:
                    break;
                case DBT_DEVICETYPESPECIFIC:
                    break;
                case DBT_DEVNODES_CHANGED:
                    break;
                case DBT_QUERYCHANGECONFIG:
                    break;
                case DBT_USERDEFINED:
                    break;
                default:
                    break;
            }
        }
   
        // Mouse
        if (m.Msg == WM_MOUSE_DOUBLE_CHICK)
        {
            MessageBox.Show("別在雙擊滑鼠左鍵了!");
        }

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    base.WndProc(ref m);
}方法二:using System.Management;

ManagementEventWatcher mew = null;

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

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

private void mew_go(object sender, System.Management.EventArrivedEventArgs e)
{
    ManagementBaseObject newEvent = e.NewEvent, newEventTarget = (newEvent["TargetInstance"] as ManagementBaseObject);
    if (newEventTarget["InterfaceType"].ToString() == "USB")
    {
        switch (newEvent.ClassPath.ClassName)
        {
            case "__InstanceCreationEvent":
                Listbox_text_Update(listBox1, Convert.ToString(newEventTarget["Caption"])+" 裝置已插入");
                break;
            case "__InstanceDeletionEvent":
                Listbox_text_Update(listBox1, Convert.ToString(newEventTarget["Caption"])+" 裝置已退出");
                break;
        }
    }
}

public static void Listbox_text_Update(ListBox lbox, string s)
{
    if (lbox.InvokeRequired)
    {
        lbox.BeginInvoke(new MethodInvoker(() => Listbox_text_Update(lbox, s)));
    }
    else
    {
        lbox.Items.Add(s);
    }
}
頁: [1]
查看完整版本: [C#] 監控USB插拔