如何在不退出应用程序的情况下重启USB设备

时间:2018-10-07 06:52:47

标签: c# winforms unsafe

在我的应用程序中,我使用USB设备进行某些操作,有时会发生USB断开并再次连接的情况,此后,我无法从应用程序中使用该设备,并且要继续使用它,我需要重新启动应用程序, 如何在不重新启动应用程序的情况下使用它?

在获得一些帮助之后,当我通过添加代码插入/拔出设备时处理了该事件”

['London', 'London']
['London', 'London', 'London']
['London', 'London', 'London', 'London']
['London', 'London', 'London', 'London', 'London']
['London', 'London', 'London', 'London', 'London', 'London']
['London', 'London', 'London', 'London', 'London', 'London', 'London']
['London', 'London', 'London', 'London', 'London', 'London', 'London', 'London']
['London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London']
['London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London']
['London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London']
['London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London', 'London']

输出为:

  

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

问题是我需要更多信息以表明它是正确的设备

试图将SharpUSBLib dll用于该目的但没有成功,我可以用于该目的吗?

谢谢

1 个答案:

答案 0 :(得分:0)

一种解决方案选项

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;
    }
}