【问题标题】:How to obtain device's info from WM_DEVICECHANGE?如何从 WM_DEVICECHANGE 获取设备信息?
【发布时间】:2013-10-06 15:23:22
【问题描述】:

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

我想问是否有任何方法可以根据设备插入/拔出时触发的WM_DEVICECHANGE 事件来获取设备的信息(名称、id、...)。

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

提前致谢。

【问题讨论】:

    标签: c# windows message device info


    【解决方案1】:

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

    以下是您需要做的详细信息:

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

    如果操作正确,您将收到WM_DEVICECHANGE 消息,其中包含Device Management Events 中描述的事件类型(在我们的例子中为DBT_DEVICEARRIVAL),以及指向详细信息的指针。需要将指针读取为 DEV_BROADCAST_HDR 结构,以便您识别这是否确实是 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 DeviceInterfaceChangeInfo 具有 DevBroadcastDeviceInterface 结构,其中包含原始 Win32 信息,但还具有一些更高级别的属性,例如:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多