EnumDisplayDevices vs WMI Win32_DesktopMonitor, how to detect active monitors?

前端 未结 5 1465
没有蜡笔的小新
没有蜡笔的小新 2020-12-01 13:22

For my current C++ project I need to detect a unique string for every monitor that is connected and active on a large number of computers.

Research has pointed to 2

5条回答
  •  爱一瞬间的悲伤
    2020-12-01 13:59

    This is my current work-in-progress code for detecting the monitor device id, reliably.

    CString DeviceID;
    DISPLAY_DEVICE dd; 
    dd.cb = sizeof(dd); 
    DWORD dev = 0; 
    // device index 
    int id = 1; 
    // monitor number, as used by Display Properties > Settings
    
    while (EnumDisplayDevices(0, dev, &dd, 0))
    {
        DISPLAY_DEVICE ddMon;
        ZeroMemory(&ddMon, sizeof(ddMon));
        ddMon.cb = sizeof(ddMon);
        DWORD devMon = 0;
    
        while (EnumDisplayDevices(dd.DeviceName, devMon, &ddMon, 0))
        {
            if (ddMon.StateFlags & DISPLAY_DEVICE_ACTIVE && 
                         !(ddMon.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER))
            {
                DeviceID.Format (L"%s", ddMon.DeviceID);
                DeviceID = DeviceID.Mid (8, DeviceID.Find (L"\\", 9) - 8);
            }
            devMon++;
    
            ZeroMemory(&ddMon, sizeof(ddMon));
            ddMon.cb = sizeof(ddMon);
        }
    
        ZeroMemory(&dd, sizeof(dd));
        dd.cb = sizeof(dd);
        dev++; 
    }
    

提交回复
热议问题