如何在不退出应用程序的情况下重启 USB 设备
How to restart USB Device without exiting Application
在我的应用程序中,我使用 USB 设备进行某些操作,有时会发生 USB 断开连接并再次连接的情况,之后我无法从我的应用程序中使用该设备并继续使用它,我需要重新启动应用程序,
我如何在不重新启动我的应用程序的情况下使用它?
经过一些帮助,我通过添加代码处理了插拔设备时的事件
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);
}
输出是:
{msg=0x219 (WM_DEVICECHANGE) hwnd=0x90242 wparam=0x7 lparam=0x0
result=0x0}
问题是我需要更多信息来表明它是正确的设备
尝试为此目的使用 SharpUSBLib dll 但没有成功,我可以为此目的使用什么?
谢谢
解决方案之一
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;
}
}
在我的应用程序中,我使用 USB 设备进行某些操作,有时会发生 USB 断开连接并再次连接的情况,之后我无法从我的应用程序中使用该设备并继续使用它,我需要重新启动应用程序, 我如何在不重新启动我的应用程序的情况下使用它?
经过一些帮助,我通过添加代码处理了插拔设备时的事件
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);
}
输出是:
{msg=0x219 (WM_DEVICECHANGE) hwnd=0x90242 wparam=0x7 lparam=0x0 result=0x0}
问题是我需要更多信息来表明它是正确的设备
尝试为此目的使用 SharpUSBLib dll 但没有成功,我可以为此目的使用什么?
谢谢
解决方案之一
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;
}
}