我正在开发一个C#程序,以便在插入设备后立即检索该设备的信息。
我想问一下,根据设备插入/拔出时触发的WM_DEVICECHANGE
事件,有没有办法获取设备的信息(名称,ID,...)。
我尝试查看WM_DEVICECHANGE
的参数,但其中没有任何内容包含有关该设备的信息。
提前致谢。
答案 0 :(得分:1)
Here是使用C#中的硬件帮助程序库的完整解决方案。 它将帮助您解决它。
答案 1 :(得分:0)
我刚刚在这里回答了类似的问题:https://stackoverflow.com/a/57182910/1886251
以下是您需要执行的详细操作:
要通过WM_DEVICECHANGE获取设备信息,您需要使用正确填充的RegisterDeviceNotification结构在user32.dll中调用名为DEV_BROADCAST_DEVICEINTERFACE_W的Win32 API。
如果操作正确,您将收到WM_DEVICECHANGE消息,其中包含DBT_DEVICEARRIVAL中所述的事件类型(在我们的情况下为Device Management Events)和详细信息的指针。指针需要读取为DEV_BROADCAST_HDR结构,从而可以识别这是否确实是DEV_BROADCAST_DEVICEINTERFACE_W结构。如果是这样,则此结构将包含设备名称,您需要对其进行解析,其中包含VID和PID。
要处理的事情很多,我花了几个小时才把它弄对。如果您需要快速解决方案,而无需执行可怕的细节,则将NuGet软件包Dapplo.Windows.Messages(VID和PID在0.9.7及更高版本中可用)添加到项目中,并在Windows Forms或WPF中使用以下代码应用程序:
var deviceNotificationSubscription = DeviceNotification
.OnDeviceArrival()
.Subscribe(deviceInterfaceChangeInfo => {
// Your code goes here, and will be automatically called
var vid = deviceInterfaceChangeInfo.Device.VendorId;
var pid = deviceInterfaceChangeInfo.Device.ProductId;
});
我的库高度依赖System.Reactive,在此不再赘述,这为您的应用程序提供了一种更实用的方法。您可以通过调用deviceNotificationSubscription.Dispose();
来停止接收事件,该库将创建其自己的隐藏消息窗口以接收窗口消息,因此您甚至可以继续在后台接收信息。
Device property of the DeviceInterfaceChangeInfo具有DevBroadcastDeviceInterface结构,该结构包含原始Win32信息,但还具有一些更高级别的属性,例如:
如果您想知道已删除的内容,也可以注册OnDeviceRemoved。
让我知道这是否行得通,并且在您遇到任何问题时,在我的Dapplo.Windows GitHub项目上提出了问题!这个库中还有很多东西,但是不幸的是,大多数文档仍然需要编写。