private static string GetDeviceName(DEV_BROADCAST_DEVICEINTERFACE dvi) { var parts = dvi.dbcc_name.Split('#'); if (parts.Length <= 3) return "(Unkown device): " + dvi.dbcc_name; var type = parts[0].Substring(parts[0].IndexOf(@"?\", StringComparison.Ordinal) + 2); var iid = parts[1]; var uid = parts[2]; var regPath = string.Format(@"SYSTEM\CurrentControlSet\Enum\{0}\{1}\{2}", type, iid, uid); using (var key = Registry.LocalMachine.OpenSubKey(regPath)) { if (key == null) return "(Unkown device): " + dvi.dbcc_name; var friendlyName = key.GetValue("FriendlyName"); var devDesc = key.GetValue("DeviceDesc"); if (friendlyName != null) return friendlyName.ToString().Split(';').Last(); if (devDesc != null) return devDesc.ToString().Split(';').Last(); } return "(Unkown device): " + dvi.dbcc_name; }
private void RegisterForNotifications() { var filter = new DEV_BROADCAST_DEVICEINTERFACE { dbcc_size = Marshal.SizeOf(typeof(DEV_BROADCAST_DEVICEINTERFACE)), dbcc_devicetype = DeviceTypes.DBT_DEVTYP_DEVICEINTERFACE, // dbcc_classguid = new Guid(0x25dbce51, 0x6c8f, 0x4a72, 0x8a,0x6d,0xb5,0x4c,0x2b,0x4f,0xc8,0x35) }; var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(filter)); try { Marshal.StructureToPtr(filter, ptr, false); var result = User32.RegisterDeviceNotification(this.Handle, ptr, (int)User32.Flags.DEVICE_NOTIFY_ALL_INTERFACE_CLASSES); if (result == IntPtr.Zero) { throw new Exception("Could not register for device notifications: " + GetLastFormattedError()); } _notificationHandle = result; } finally { Marshal.FreeHGlobal(ptr); } }