1

我正在尝试确定已连接到计算机的设备的类类型。如果它是监视器(例如电视或投影仪),我想执行特定操作,例如更改计算机的显示设置。

我确定设备类类型的方法包括以下步骤:

  • 注册设备通知
  • 检测 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!

4

1 回答 1

1

{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}GUID_DEVINTERFACE_MONITOR

MSDN 页面在这里。你的功能一定有问题isMonitorDevice(),我从这里看不到。使用 IsEqualGUID() 比较 guid 值。

于 2013-01-27T10:47:28.363 回答