Search code examples
c#winformsunsafe

How to restart USB Device without exiting Application


In my application I use USB device for some operation, sometimes happens that the USB disconnected and connected again, after that I can't use the device from my application and to keep using it I need to restart the app, How could I use it without restarting my application?

after some help, I handled the event when I plug / unplug the device by adding the code"

    public enum WM : uint
    {
        /// <summary>
        /// Notifies an application of a change to the hardware configuration of a device or the computer.
        /// </summary>
        DEVICECHANGE = 0x0219,
    }

    protected override void WndProc(ref Message m)
    {

        switch ((WM)m.Msg)
        {
            case WM.DEVICECHANGE:
                MessageBox.Show(m.ToString(), "USB Detected",MessageBoxButtons.OK,MessageBoxIcon.Information);
                break;
        }
        base.WndProc(ref m);
    }

the output is:

{msg=0x219 (WM_DEVICECHANGE) hwnd=0x90242 wparam=0x7 lparam=0x0 result=0x0}

the problem is that I need more information that will indicate that it's the correct device

tried to use SharpUSBLib dll for that purpose without success, what could i use for that purpose?

Thanks


Solution

  • one of the solutions option

    public partial class Form1 : Form
    {
    
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
    
        }
    
        public enum WM : uint
        {
            /// <summary>
            /// Notifies an application of a change to the hardware configuration of a device or the computer.
            /// </summary>
            DEVICECHANGE = 0x0219,
        }
    
        protected override void WndProc(ref Message m)
        {
    
            switch ((WM)m.Msg)
            {
                case WM.DEVICECHANGE:
    
                    var usbDevices = GetUSBDevices();
                    txtInfo.Text = string.Empty;
    
                    foreach (var usbDevice in usbDevices)
                    {
                        if (usbDevice.Name.Contains("Name of my usb device"))
                        {
                            // Code ..
                        }
                    }
                    break;
            }
            base.WndProc(ref m);
        }
    
        static List<USBDeviceInfo> GetUSBDevices()
        {
            List<USBDeviceInfo> devices = new List<USBDeviceInfo>();
    
            ManagementObjectCollection collection;
            using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_PnPEntity where DeviceID Like ""USB%"""))
                collection = searcher.Get();
    
            foreach (var device in collection)
            {
                devices.Add(new USBDeviceInfo(
                (string)device.GetPropertyValue("Name"),
                (string)device.GetPropertyValue("DeviceID"),
                (string)device.GetPropertyValue("PNPDeviceID"),
                (string)device.GetPropertyValue("Description")
                ));
            }
    
            collection.Dispose();
            return devices;
        }
    }
    
    class USBDeviceInfo
    {
        public string Name { get; private set; }
        public string DeviceID { get; private set; }
        public string PnpDeviceID { get; private set; }
        public string Description { get; private set; }
    
        public USBDeviceInfo(string name, string deviceID, string pnpDeviceID, string description)
        {
            this.Name = name;
            this.DeviceID = deviceID;
            this.PnpDeviceID = pnpDeviceID;
            this.Description = description;
        }
    }