C++ DBT_DEVICEARRIVAL消息正在发送无法识别的类GUID
我正在尝试确定已连接到计算机的设备的类类型。如果是显示器(如电视或投影仪),我想执行特定操作,如更改计算机的显示设置 我确定设备类别类型的方法包括以下步骤:C++ DBT_DEVICEARRIVAL消息正在发送无法识别的类GUID,c++,winapi,ports,C++,Winapi,Ports,我正在尝试确定已连接到计算机的设备的类类型。如果是显示器(如电视或投影仪),我想执行特定操作,如更改计算机的显示设置 我确定设备类别类型的方法包括以下步骤: 注册设备通知 检测WM_DEVICECHANGE事件:如果wParam值=DBT_DEVICEARRIVAL: 我将lParam值转换为PDEV_BROADCAST_DEVICEINTERFACE变量,并检查该变量 dbcc_类GUID属性 如果dbcc_classguid属性==“{4d36e96e-e325-11ce-bfc1-08
- 注册设备通知
- 检测WM_DEVICECHANGE事件:如果wParam值=DBT_DEVICEARRIVAL:
- 我将lParam值转换为PDEV_BROADCAST_DEVICEINTERFACE变量,并检查该变量 dbcc_类GUID属性
- 如果dbcc_classguid属性==“{4d36e96e-e325-11ce-bfc1-08002be10318}”,则我已找到一个监视设备
{866519b5-3f07-4c97-b7df-24c5d8a8ccb8} 有趣的是,如果我检查Windows设备管理器应用程序(在连接电视后),我可以看到电视存储在监视器下,并且它的类GUID确实是监视器类GUID,即{4d36e96e-e325-11ce-bfc1-08002be10318}。所以这真的很奇怪。我还将一个普通的电脑显示器屏幕连接到我的笔记本电脑上,它发送了完全相同的guid,还发送了两条到达消息 这是我的密码。为什么我在将电视连接到我的电脑时会收到奇怪的类guid?这两个GUID用于什么类型的设备?也许我收到的是硬件guid而不是类guid 我的应用程序的输出是: 消息DBT_DEVICEARRIVAL: 设备数据: \?\显示#GSM3AD7#5&20a3f50d&0&UID513#{866519b5-3f07-4c97-b7df-24 c5d8a8ccb8}5 {866519b5-3f07-4c97-b7df-24c5d8a8ccb8}不是监视器设备 消息DBT_DEVICEARRIVAL: 设备数据: \?\显示#GSM3AD7#5&20a3f50d&0&UID513#{e6f07b5f-ee97-4a90-b076-33 F57BF4EA7}5 {e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}不是监视器设备
{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
是GUID\u deviceinterface\u监视器
MSDN页。您的
isMonitorDevice()
函数肯定有问题,我无法从这里看到它。使用IsEqualGUID()比较guid值。{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
isguid\u设备接口\u监视器
MSDN页。您的
isMonitorDevice()
函数肯定有问题,我无法从这里看到它。使用IsEqualGUID()比较guid值。知道什么是{866519b5-3f07-4c97-b7df-24c5d8a8ccb8}吗?查看注册表,HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses项。知道什么是{866519b5-3f07-4c97-b7df-24c5d8a8ccb8}吗?查看注册表,HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses项。
case DBT_DEVICEARRIVAL:
{
PDEV_BROADCAST_HDR pBroad = (PDEV_BROADCAST_HDR) lParam;
if (pBroad->dbch_devicetype != DBT_DEVTYP_DEVICEINTERFACE) {
debug_print("pBroad->dbch_devicetype != DBT_DEVTYP_DEVICEINTERFACE\n");
break;
}
PDEV_BROADCAST_DEVICEINTERFACE pInter = (PDEV_BROADCAST_DEVICEINTERFACE) pBroad;
_tprintf(_T("Device Data: %s\n %x\n\n"), pInter->dbcc_name, pInter->dbcc_devicetype);
debug_print("Printing Device Data");
outputDeviceData(toString(pInter->dbcc_classguid), SPDRP_CLASSGUID);
if (isMonitorDevice(pInter->dbcc_classguid)) {
// TODO: change display mode and etc.
debug_print("is MonitorDevice!!!");
}
else debug_print("is NOT MonitorDevice!!!");
}
break;