Список подключенных HID-устройств - C#
Формулировка задачи:
Доброго времени суток.
Подскажите хотя-бы как сразу же отключить новое устройство после получения WM_DEVICECHANGE? Тут уж сам найти не могу.
Более менее неактуальные вопросы
foreach (var dInfo in DriveInfo.GetDrives()) { if (dInfo.IsReady && dInfo.DriveType == DriveType.Removable) usbBox1.Items.Add(string.Format("{0} ({1})", (string.IsNullOrEmpty(dInfo.VolumeLabel) ? "Съёмный диск" : dInfo.VolumeLabel), dInfo.Name));using System; using LibUsbDotNet; using LibUsbDotNet.Info; using LibUsbDotNet.Main; using System.Collections.ObjectModel; namespace Examples { internal class ShowInfo { public static UsbDevice MyUsbDevice; public static void Main(string[] args) { // Dump all devices and descriptor information to console output. UsbRegDeviceList allDevices = UsbDevice.AllDevices; foreach (UsbRegistry usbRegistry in allDevices) { if (usbRegistry.Open(out MyUsbDevice)) { Console.WriteLine("WTF"); Console.WriteLine(MyUsbDevice.Info.ToString()); for (int iConfig = 0; iConfig < MyUsbDevice.Configs.Count; iConfig++) { UsbConfigInfo configInfo = MyUsbDevice.Configs[iConfig]; Console.WriteLine(configInfo.ToString()); ReadOnlyCollection<UsbInterfaceInfo> interfaceList = configInfo.InterfaceInfoList; for (int iInterface = 0; iInterface < interfaceList.Count; iInterface++) { UsbInterfaceInfo interfaceInfo = interfaceList[iInterface]; Console.WriteLine(interfaceInfo.ToString()); ReadOnlyCollection<UsbEndpointInfo> endpointList = interfaceInfo.EndpointInfoList; for (int iEndpoint = 0; iEndpoint < endpointList.Count; iEndpoint++) { Console.WriteLine(endpointList[iEndpoint].ToString()); } } } } } // Free usb resources. // This is necessary for libusb-1.0 and Linux compatibility. UsbDevice.Exit(); // Wait for user input.. Console.ReadKey(); } } }if (nEventType == Dbt.DBT_DEVICEARRIVAL || nEventType == Dbt.DBT_DEVICEREMOVECOMPLETE)Form1.csusing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsFormsApplication6 { public partial class Form1 : Form { private IntPtr m_hNotifyDevNode; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Guid hidGuid = new Guid("4d1e55b2-f16f-11cf-88cb-001111000030"); Guid usbXpressGuid = new Guid("3c5e1462-5695-4e18-876b-f3f3d08aaf18"); Guid cp210xGuid = new Guid("993f7832-6e2d-4a0f-b272-e2c78e74f93e"); Guid newCP210xGuid = new Guid("a2a39220-39f4-4b88-aecb-3d86a35dc748"); RegisterNotification(hidGuid); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { UnregisterNotification(); } private void RegisterNotification(Guid guid) { Dbt.DEV_BROADCAST_DEVICEINTERFACE devIF = new Dbt.DEV_BROADCAST_DEVICEINTERFACE(); IntPtr devIFBuffer; // Set to HID GUID devIF.dbcc_size = Marshal.SizeOf(devIF); devIF.dbcc_devicetype = Dbt.DBT_DEVTYP_DEVICEINTERFACE; devIF.dbcc_reserved = 0; devIF.dbcc_classguid = guid; // Allocate a buffer for DLL call devIFBuffer = Marshal.AllocHGlobal(devIF.dbcc_size); // Copy devIF to buffer Marshal.StructureToPtr(devIF, devIFBuffer, true); // Register for HID device notifications m_hNotifyDevNode = Dbt.RegisterDeviceNotification(this.Handle, devIFBuffer, Dbt.DEVICE_NOTIFY_WINDOW_HANDLE); // Copy buffer to devIF Marshal.PtrToStructure(devIFBuffer, devIF); // Free buffer Marshal.FreeHGlobal(devIFBuffer); } // Unregister HID device notification private void UnregisterNotification() { uint ret = Dbt.UnregisterDeviceNotification(m_hNotifyDevNode); } protected override void WndProc(ref Message m) { // Intercept the WM_DEVICECHANGE message if (m.Msg == Dbt.WM_DEVICECHANGE) { // Get the message event type int nEventType = m.WParam.ToInt32(); // Check for devices being connected or disconnected if (nEventType == Dbt.DBT_DEVICEARRIVAL || nEventType == Dbt.DBT_DEVICEREMOVECOMPLETE) { Dbt.DEV_BROADCAST_HDR hdr = new Dbt.DEV_BROADCAST_HDR(); // Convert lparam to DEV_BROADCAST_HDR structure Marshal.PtrToStructure(m.LParam, hdr); if (hdr.dbch_devicetype == Dbt.DBT_DEVTYP_DEVICEINTERFACE) { Dbt.DEV_BROADCAST_DEVICEINTERFACE_1 devIF = new Dbt.DEV_BROADCAST_DEVICEINTERFACE_1(); // Convert lparam to DEV_BROADCAST_DEVICEINTERFACE structure Marshal.PtrToStructure(m.LParam, devIF); // Get the device path from the broadcast message string devicePath = new string(devIF.dbcc_name); // Remove null-terminated data from the string int pos = devicePath.IndexOf((char)0); if (pos != -1) { devicePath = devicePath.Substring(0, pos); } // An HID device was connected or removed if (nEventType == Dbt.DBT_DEVICEREMOVECOMPLETE) { MessageBox.Show("Device "" + devicePath + "" was removed"); } else if (nEventType == Dbt.DBT_DEVICEARRIVAL) { MessageBox.Show("Device "" + devicePath + "" arrived"); } } } } base.WndProc(ref m); } } }Dbt.csusing System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; class Dbt { #region Dbt Class - Constants public const ushort WM_DEVICECHANGE = 0x0219; public const ushort DBT_DEVICEARRIVAL = 0x8000; public const ushort DBT_DEVICEREMOVECOMPLETE = 0x8004; public const ushort DBT_DEVTYP_DEVICEINTERFACE = 0x0005; public const int DEVICE_NOTIFY_WINDOW_HANDLE = 0x0000; #endregion #region Dbt Class - Device Change Structures [StructLayout(LayoutKind.Sequential)] public class DEV_BROADCAST_DEVICEINTERFACE { public int dbcc_size; public int dbcc_devicetype; public int dbcc_reserved; public Guid dbcc_classguid; public char dbcc_name; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public class DEV_BROADCAST_DEVICEINTERFACE_1 { public int dbcc_size; public int dbcc_devicetype; public int dbcc_reserved; public Guid dbcc_classguid; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)] public char[] dbcc_name; } [StructLayout(LayoutKind.Sequential)] public class DEV_BROADCAST_HDR { public int dbch_size; public int dbch_devicetype; public int dbch_reserved; } #endregion #region DLL Imports [DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern IntPtr RegisterDeviceNotification(IntPtr hRecipient, IntPtr NotificationFilter, uint Flags); [DllImport("user32.dll")] public static extern uint UnregisterDeviceNotification(IntPtr Handle); #endregion }
Парюсь уже 4 часа 46 минут
Эхх, сплошной игнор, неужели никто помочь не может?
Подскажите как использовать DiUninstallDevice в шарпе?
Решение задачи: «Список подключенных HID-устройств»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace App { public static class Win32: Object { public const int WM_DEVICECHANGE = 0x0219; public const int DEVICE_ARRIVAL = 0x8000; public const int DEVICE_REMOVECOMPLETE = 0x8004; private const int DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = 0x4; private const int DEVTYP_DEVICEINTERFACE = 0x05; private const int DBT_DEVTYP_DEVICEINTERFACE = 0x00000005; private const int DBT_DEVTYP_HANDLE = 0x00000006; private const int DBT_DEVTYP_OEM = 0x00000000; private const int DBT_DEVTYP_PORT = 0x00000003; private const int DBT_DEVTYP_VOLUME = 0x00000002; [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)] public class DeviceBroadcastInterface { public int Size; public int DeviceType; public int Reserved; public Guid ClassGuid; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string Name; } [StructLayout(LayoutKind.Sequential)] public struct DEV_BROADCAST_HDR { public uint dbch_Size; public uint dbch_DeviceType; public uint dbch_Reserved; } [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr RegisterDeviceNotification(IntPtr hwnd, DeviceBroadcastInterface oInterface, uint nFlags); [DllImport("user32.dll", SetLastError = true)] private static extern bool UnregisterDeviceNotification(IntPtr hHandle); public static IntPtr RegisterForUsbEvents(IntPtr hWnd) { var oInterfaceIn = new DeviceBroadcastInterface(); oInterfaceIn.Size = Marshal.SizeOf(oInterfaceIn); oInterfaceIn.ClassGuid = Guid.Empty; oInterfaceIn.DeviceType = DEVTYP_DEVICEINTERFACE; oInterfaceIn.Reserved = 0; return RegisterDeviceNotification(hWnd, oInterfaceIn, DEVICE_NOTIFY_ALL_INTERFACE_CLASSES); } public static bool UnregisterForUsbEvents(IntPtr hHandle) { return UnregisterDeviceNotification(hHandle); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д