whitefox 發表於 2023-7-8 13:11:28

[C#] 偵測(Detection)USB的插入(Insert)以及HID的插入和拔除(Remove)

要修改偵測裝置或是增加可以修改這兩行
USB為GUID_DEVINTERFACE_USB_DEVICE = new Guid("A5DCBF10-6530-11D2-901F-00C04FB951ED");
HID為GUID_DEVINTERFACE_HID        = new Guid("4D1E55B2-F16F-11CF-88CB-001111000030");using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication3
{
    //public partial class Form1 : Form
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            RegisterHidNotification();
        }

        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
            case Win32.WM_DEVICECHANGE:
                OnDeviceChange(ref m);
                break;
            }
            base.WndProc(ref m);
        }

        void OnDeviceChange(ref Message msg)
        {
            int wParam = (int)msg.WParam;

            if (wParam == Win32.DBT_DEVICEARRIVAL)
                label1.Text = "Arrival";
            else if (wParam == Win32.DBT_DEVICEREMOVECOMPLETE)
                label1.Text = "Remove";
        }

        void RegisterHidNotification()
        {
            Win32.DEV_BROADCAST_DEVICEINTERFACE dbi = new Win32.DEV_BROADCAST_DEVICEINTERFACE();

            int size            = Marshal.SizeOf(dbi);
            dbi.dbcc_size       = size;
            dbi.dbcc_devicetype = Win32.DBT_DEVTYP_DEVICEINTERFACE;
            dbi.dbcc_reserved   = 0;
            dbi.dbcc_classguid  = Win32.GUID_DEVINTERFACE_HID;
            dbi.dbcc_name       = 0;

            IntPtr buffer = Marshal.AllocHGlobal(size);
            Marshal.StructureToPtr(dbi, buffer, true);
            IntPtr r = Win32.RegisterDeviceNotification(Handle, buffer, Win32.DEVICE_NOTIFY_WINDOW_HANDLE);

            if (r == IntPtr.Zero)
                label1.Text = Win32.GetLastError().ToString();
        }
    }

    class Win32
    {
        public const int WM_DEVICECHANGE              = 0x0219;
        public const int DBT_DEVICEARRIVAL            = 0x8000;
        public const int DBT_DEVICEREMOVECOMPLETE     = 0x8004;
        public const int DEVICE_NOTIFY_WINDOW_HANDLE  = 0;
        public const int DEVICE_NOTIFY_SERVICE_HANDLE = 1;

        public const int DBT_DEVTYP_DEVICEINTERFACE   = 5;

        public static Guid GUID_DEVINTERFACE_HID        = new Guid("4D1E55B2-F16F-11CF-88CB-001111000030");
        public static Guid GUID_DEVINTERFACE_USB_DEVICE = new Guid("A5DCBF10-6530-11D2-901F-00C04FB951ED");

        
        public class DEV_BROADCAST_DEVICEINTERFACE
        {
            public int   dbcc_size;
            public int   dbcc_devicetype;
            public int   dbcc_reserved;
            public Guid  dbcc_classguid;
            public short dbcc_name;
        }

        
        public static extern IntPtr RegisterDeviceNotification(IntPtr hRecipient, IntPtr NotificationFilter, Int32 Flags);
        
        public static extern int GetLastError();
    }
}
頁: [1]
查看完整版本: [C#] 偵測(Detection)USB的插入(Insert)以及HID的插入和拔除(Remove)