我正在尝试确定已连接到计算机的设备的类类型。如果是监视器(例如电视或投影仪),我想执行特定的操作,例如更改计算机的显示设置。
我确定设备类类型的方法包括以下步骤:
- 注册设备通知
- 检测WM_DEVICECHANGE事件:如果wParam值= DBT_DEVICEARRIVAL:
- 我将lParam值转换为PDEV_BROADCAST_DEVICEINTERFACE变量并检查变量 dbcc_classguid属性
- 如果dbcc_classguid属性==“{4d36e96e-e325-11ce-bfc1-08002be10318}”,那么我找到了一台监控设备
我的问题:每当我将LG宽屏电视连接到我的电脑时,它都会发送一个无法识别的dbcc_classguid。
出于某种原因,在连接电视时,我收到2条DBT_DEVICEARRIVAL消息。 lParam包含以下GUID。这是什么device class?:
{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
{866519b5-3f07-4c97-b7df-24c5d8a8ccb8}
有趣的是,如果我检查Windows设备管理器应用程序(在连接电视之后),我可以看到电视存储在监视器下,并且其类GUID确实是监视类GUID,即{4d36e96e-e325- 11ce-BFC1-08002BE10318}。所以这真的很奇怪。此外,我将一个普通的电脑显示器屏幕连接到我的笔记本电脑,它发送完全相同的GUID,并发送了2个到达消息。
继承我的代码。在将电视连接到计算机时,为什么会收到奇怪的类GUID?那两个GUID是什么类型的设备?也许我收到硬件GUID 而不是类GUID ?
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;
我的申请表的输出是:
消息DBT_DEVICEARRIVAL:
设备数据: ?\ \ DISPLAY#GSM3AD7#5和; 20a3f50d&安培0安培; UID513#{866519b5-3f07-4c97-b7df-24 c5d8a8ccb8} 5
{866519b5-3f07-4c97-b7df-24c5d8a8ccb8}不是MonitorDevice !!!
消息DBT_DEVICEARRIVAL:
设备数据: ?\ \ DISPLAY#GSM3AD7#5和; 20a3f50d&安培0安培; UID513#{e6f07b5f-ee97-4a90-b076-33 f57bf4eaa7} 5
{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}不是MonitorDevice !!!
答案 0 :(得分:1)
{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
是GUID_DEVINTERFACE_MONITOR
MSDN网页is here。您的isMonitorDevice()
功能肯定有问题,我从这里看不到它。使用IsEqualGUID()来比较guid值。