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
base.WndProc(ref m);
after switch ((WM)m.Msg)
. This will render mute any result. The, you have to identify the type of message. A bunch of different states are passed inwParam
. You're interested inuint DBT_DEVICEARRIVAL = 0x8000;
anduint DBT_DEVICEREMOVECOMPLETE = 0x8004;
.lParam
will report: 1) the device type (you're probably interested inuint DBT_DEVTYP_VOLUME = 0x0002;
) 2) the Logical Disk ID (the drive letter) =>int DeviceType = Marshal.ReadInt32(m.LParam, 4);
(...) - Jimiuint DeviceIDNumber = Marshal.ReadInt32(m.LParam, 12);
char DeviceLetter = (char)(65 + (int)Math.Log(DeviceIDNumber , 2));
You could use the code in the question I linked (tested & working). Plus, get details on the USB device: Get serial number of usb storage device. If you think you need theWndProc
detection style code written down, let me know. - Jimi