我正在尝试确定已连接到计算机的设备的类类型。如果它是监视器(例如电视或投影仪),我想执行特定操作,例如更改计算机的显示设置。
我确定设备类类型的方法包括以下步骤:
- 注册设备通知
- 检测 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。这是什么设备类?:
{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
{866519b5-3f07-4c97-b7df-24c5d8a8ccb8}
有趣的是,如果我检查 Windows 设备管理器应用程序(在我连接电视之后),我可以看到电视存储在监视器下,并且它的类 GUID 确实是监视器类 GUID,即 {4d36e96e-e325-11ce-bfc1 -08002be10318}。所以这真的很奇怪。我还把一个普通的电脑显示器屏幕连接到我的笔记本电脑上,它发送了完全相同的 GUID,还发送了 2 条到达消息。
这是我的代码。为什么我在将电视连接到计算机时收到奇怪的类 GUID?这 2 个 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!