如何在Windows进程回调中断开连接时获取设备信息(硬件ID)?

时间:2019-06-13 17:32:22

标签: c++ windows notifications device handle

使用Windows进程回调进行设备更改,我能够在设备到达时设置一个句柄,让我以一种简单的方式查看它的设备属性(如硬件ID),而无需进行任何设备枚举。

但是,在“设备断开连接”上,收到的句柄无效,这似乎是正确的,因为该设备不再连接,但是我无法查看设备属性。有没有办法可以使用手柄?

DEV_BROADCAST_HDR* devHDR = reinterpret_cast<DEV_BROADCAST_HDR*>(lParam);
if (devHDR->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
{
    DEV_BROADCAST_DEVICEINTERFACE* devInterface = reinterpret_cast<DEV_BROADCAST_DEVICEINTERFACE*>(lParam);
    DeviceHandle = CreateFile(devInterface->dbcc_name, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
    if(DeviceHandle ==  != INVALID_HANDLE_VALUE){
        // arrive gets here
    } else {
        // disconnect gets here
    }
}

基本上,由于无法获得有效的断开连接句柄,因此无法从DEV_BROADCAST_DEVICEINTERFACE结构获取硬件ID和其他数据。是否还有另一种方法来获取断开连接时的设备硬件ID?

2 个答案:

答案 0 :(得分:1)

连接设备时,将断开连接所需的信息存储在地图中,在该地图中,您将设备唯一的内容用作密钥。

当设备断开连接时,使用在断开连接事件中获得的密钥在地图中查找信息,然后删除条目。

示例:

for (int i = 1; i <= 1000; i++)
            {
                HtmlWeb web = new HtmlWeb();
                var html = "https://myanimelist.net/character/" + i;
                var htmlDoc = web.Load(html);
                foreach (var item in htmlDoc.DocumentNode.SelectNodes("//*[@]"))
                {
                    string n;
                    n = item.GetAttributeValue("src", "");
                    foreach (var item2 in htmlDoc.DocumentNode.SelectNodes("//*[@src and @alt='" + n + "']"))
                    {
                        Console.WriteLine(item2.GetAttributeValue("src", ""));
                    }
                }


            }

答案 1 :(得分:0)

您的方法不正确。

您必须首先检查 wParam 并测试== DBT_DEVICEARRIVAL 和== DBT_DEVICEREMOVECOMPLETE

DBT_DEVICEREMOVECOMPLETE 测试中,您将填充 lParam 以获取 DEV_BROADCAST_HANDLE