private static string CleanUpDeviceInterfaceName(string deviceName) { // Remove null-terminated data from the string int pos = deviceName.IndexOf((char)0); if (pos != -1) { deviceName = deviceName.Substring(0, pos); } string temp; temp = @"\\?\USB#"; if (deviceName.StartsWith(temp)) { deviceName = @"USB\" + deviceName.Substring(temp.Length); } temp = "#" + GUID_DEVINTERFACE_USB_DEVICE.ToString("B"); if (deviceName.EndsWith(temp)) { deviceName = deviceName.Substring(0, deviceName.Length - temp.Length); } deviceName = deviceName.Replace("#", @"\"); // \\?\USB#VID_046D&PID_085C#7F1799DF#{a5dcbf10-6530-11d2-901f-00c04fb951ed} // USB\VID_046D&PID_085C\7F1799DF return(deviceName); }
protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_CREATE: try { DEV_BROADCAST_DEVICEINTERFACE devBroadcastDeviceInterface = new DEV_BROADCAST_DEVICEINTERFACE(); IntPtr devBroadcastDeviceInterfaceBuffer; IntPtr deviceNotificationHandle = IntPtr.Zero; Int32 size = 0; // frmMy is the form that will receive device-change messages. size = Marshal.SizeOf(devBroadcastDeviceInterface); devBroadcastDeviceInterface.dbcc_size = size; devBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; devBroadcastDeviceInterface.dbcc_reserved = 0; devBroadcastDeviceInterface.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE.ToByteArray(); devBroadcastDeviceInterfaceBuffer = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(devBroadcastDeviceInterface, devBroadcastDeviceInterfaceBuffer, true); deviceNotificationHandle = NativeMethods.RegisterDeviceNotification(this.Handle, devBroadcastDeviceInterfaceBuffer, DEVICE_NOTIFY_WINDOW_HANDLE); } catch { } break; case WM_DEVICECHANGE: // The WParam value identifies what is occurring. WM_DEVICECHANGE_enum n = (WM_DEVICECHANGE_enum)m.WParam; var l = m.LParam; if (n == WM_DEVICECHANGE_enum.DBT_DEVICEREMOVEPENDING) { Console.WriteLine("DBT_DEVICEREMOVEPENDING"); } if (n == WM_DEVICECHANGE_enum.DBT_DEVNODES_CHANGED) { Console.WriteLine("DBT_DEVNODES_CHANGED"); } if (n == WM_DEVICECHANGE_enum.DBT_DEVICEARRIVAL || n == WM_DEVICECHANGE_enum.DBT_DEVICEREMOVECOMPLETE) { Console.WriteLine(((WM_DEVICECHANGE_enum)n).ToString()); DEV_BROADCAST_HDR hdr = new DEV_BROADCAST_HDR(); Marshal.PtrToStructure(m.LParam, hdr); try { switch (hdr.dbch_devicetype) { case DBT_DEVTYP_DEVICEINTERFACE: DEV_BROADCAST_DEVICEINTERFACE inter = new DEV_BROADCAST_DEVICEINTERFACE(); Marshal.PtrToStructure(m.LParam, inter); log.InfoFormat("Interface {0}", ASCIIEncoding.Unicode.GetString(inter.dbcc_name, 0, inter.dbcc_size - (4 * 3))); break; case DBT_DEVTYP_PORT: DEV_BROADCAST_PORT prt = new DEV_BROADCAST_PORT(); Marshal.PtrToStructure(m.LParam, prt); log.InfoFormat("port {0}", ASCIIEncoding.Unicode.GetString(prt.dbcp_name, 0, prt.dbcp_size - (4 * 3))); this.BeginInvoke(new Action(() => { textBox1.AppendText("port " + ASCIIEncoding.Unicode.GetString(prt.dbcp_name, 0, prt.dbcp_size - (4 * 3)).Trim().TrimEnd('\0') + "\r\n"); })); new Thread(FWUpload).Start(new Tuple <int, string>(index++, ASCIIEncoding.Unicode.GetString(prt.dbcp_name, 0, prt.dbcp_size - (4 * 3)) .Trim().TrimEnd('\0'))); break; } } catch { } //string port = Marshal.PtrToStringAuto((IntPtr)((long)m.LParam + 12)); //Console.WriteLine("Added port {0}",port); } log.InfoFormat("Device Change {0} {1} {2}", m.Msg, (WM_DEVICECHANGE_enum)m.WParam, m.LParam); if (DeviceChanged != null) { try { DeviceChanged((WM_DEVICECHANGE_enum)m.WParam); } catch { } } break; default: //Console.WriteLine(m.ToString()); break; } base.WndProc(ref m); }
protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_CREATE: try { DEV_BROADCAST_DEVICEINTERFACE devBroadcastDeviceInterface = new DEV_BROADCAST_DEVICEINTERFACE(); IntPtr devBroadcastDeviceInterfaceBuffer; IntPtr deviceNotificationHandle = IntPtr.Zero; Int32 size = 0; // frmMy is the form that will receive device-change messages. size = Marshal.SizeOf(devBroadcastDeviceInterface); devBroadcastDeviceInterface.dbcc_size = size; devBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; devBroadcastDeviceInterface.dbcc_reserved = 0; devBroadcastDeviceInterface.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE.ToByteArray(); devBroadcastDeviceInterfaceBuffer = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(devBroadcastDeviceInterface, devBroadcastDeviceInterfaceBuffer, true); deviceNotificationHandle = NativeMethods.RegisterDeviceNotification(this.Handle, devBroadcastDeviceInterfaceBuffer, DEVICE_NOTIFY_WINDOW_HANDLE); } catch { } break; case WM_DEVICECHANGE: // The WParam value identifies what is occurring. WM_DEVICECHANGE_enum n = (WM_DEVICECHANGE_enum)m.WParam; var l = m.LParam; if (n == WM_DEVICECHANGE_enum.DBT_DEVICEREMOVEPENDING) { Console.WriteLine("DBT_DEVICEREMOVEPENDING"); } if (n == WM_DEVICECHANGE_enum.DBT_DEVNODES_CHANGED) { Console.WriteLine("DBT_DEVNODES_CHANGED"); // DoScan(); } if (n == WM_DEVICECHANGE_enum.DBT_DEVICEARRIVAL) { Console.WriteLine(((WM_DEVICECHANGE_enum)n).ToString()); DEV_BROADCAST_HDR hdr = new DEV_BROADCAST_HDR(); Marshal.PtrToStructure(m.LParam, hdr); try { switch (hdr.dbch_devicetype) { case DBT_DEVTYP_DEVICEINTERFACE: DEV_BROADCAST_DEVICEINTERFACE inter = new DEV_BROADCAST_DEVICEINTERFACE(); Marshal.PtrToStructure(m.LParam, inter); var devname = GetDeviceName(inter); Console.WriteLine("Interface {0} {1}", inter.dbcc_name, devname); break; case DBT_DEVTYP_PORT: DEV_BROADCAST_PORT prt = new DEV_BROADCAST_PORT(); Marshal.PtrToStructure(m.LParam, prt); Console.WriteLine("port {0}", prt.dbcp_name); Uploader up = null; try { up = new px4uploader.Uploader(new SerialPort(prt.dbcp_name, 115200)); up.identify(); up.close(); } catch { } break; } } catch { } //string port = Marshal.PtrToStringAuto((IntPtr)((long)m.LParam + 12)); //Console.WriteLine("Added port {0}",port); } Console.WriteLine("Device Change {0} {1} {2}", m.Msg, (WM_DEVICECHANGE_enum)m.WParam, m.LParam); if (DeviceChanged != null) { try { DeviceChanged((WM_DEVICECHANGE_enum)m.WParam); } catch { } } break; default: //Console.WriteLine(m.ToString()); break; } base.WndProc(ref m); }