EnumDisplayDevices vs WMI Win32_DesktopMonitor,如何检测活动监视器?

Sam*_*ron 9 c++ windows wmi winapi

对于我当前的C++项目,我需要为在大量计算机上连接并处于活动状态的每个监视器检测唯一字符串.

研究指出了两种选择

  1. 使用WMI并查询Win32_DesktopMonitor以查找所有活动的监视器.使用PNPDeviceID进行监视器的唯一标识.

  2. 使用EnumDisplayDevices API,深入挖掘以获取设备ID.

我对使用设备ID进行唯一模型识别感兴趣,因为使用默认即插即用驱动程序的监视器将报告通用字符串作为监视器名称"默认即插即用监视器"

我一直遇到WMI方法的问题,它似乎只在我的Vista机器上返回1个显示器,看着它看起来它在非WDDM设备上无法正常工作.

当EnumDisplayDevices从后台服务运行时(尤其是在Vista上运行),它似乎有点问题,如果它在会话0中它将不返回任何信息.

  • 有没有其他人必须做类似的事情(为所有连接的活动监视器找到唯一的模型字符串?)

  • 什么方法效果最好?

Sam*_*ron 10

这是我当前正在进行的用于可靠地检测监视器设备ID的正在进行的代码.

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++; 
}
Run Code Online (Sandbox Code Playgroud)