使用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?
答案 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