gpt4 book ai didi

c# - 如何从 WM_DEVICECHANGE 获取设备信息?

转载 作者:可可西里 更新时间:2023-11-01 10:37:09 28 4
gpt4 key购买 nike

我正在开发一个 C# 程序,以便在插入设备后立即检索设备的信息。

我想问一下,有什么方法可以根据设备插入/拔出时触发的 WM_DEVICECHANGE 事件获取设备的信息(名称、ID、...) .

我尝试查看 WM_DEVICECHANGE 的参数,但其中没有任何内容包含有关设备的信息。

提前致谢。

最佳答案

我刚刚在这里回答了类似的问题:https://stackoverflow.com/a/57182910/1886251

以下是您需要执行的操作的详细信息:

通过WM_DEVICECHANGE获取设备信息您需要在名为 RegisterDeviceNotification 的 user32.dll 中调用 Win32 API正确填写 DEV_BROADCAST_DEVICEINTERFACE_W结构。

如果操作正确,您将得到 WM_DEVICECHANGE消息,其中包含事件类型(在我们的示例中为 DBT_DEVICEARRIVAL ),如 Device Management Events 中所述,以及指向详细信息的指针。指针需要被读取为 DEV_BROADCAST_HDR struct ,让您识别这是否确实是 DEV_BROADCAST_DEVICEINTERFACE_W结构。如果是这样,此结构将包含一个设备名称,您需要对其进行解析,因为它包含 VID 和 PID。

要处理的内容很多,我花了几个小时才搞定。如果您需要一个快速的解决方案,并跳过实现可怕的细节,请添加 NuGet 包 Dapplo.Windows.Messages (VID 和 PID 在 0.9.7 及更高版本中可用)到您的项目并在 Windows 窗体或 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 DeviceInterfaceChangeInfoDevBroadcastDeviceInterface struct,它包含原始的 Win32 信息,但另外还有一些更高级别的属性,例如:

  1. 从注册表中检索的友好名称
  2. USB、HID 等设备类型,包括 IsUSB
  3. 供应商编号
  4. 产品编号
  5. 一个DeviceInterfaceClass枚举以更轻松地访问类的代码
  6. 生成的 URL 以获取有关设备的更多信息

如果您想知道删除了什么,您也可以注册 OnDeviceRemoved。

让我知道这是否有效并在此处提供帮助,如果您有任何疑问,请在我的 Dapplo.Windows 上提出问题GitHub 项目!该库中还有很多内容,但不幸的是,大多数文档仍需要编写。

关于c# - 如何从 WM_DEVICECHANGE 获取设备信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19210421/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com