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

2024-05-21

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

研究指出了两种选择

  1. 使用 WMI 并查询 Win32_DesktopMonitor 以获取所有活动监视器。使用 PNPDeviceID 来唯一标识监视器。

  2. 使用 EnumDisplayDevices API,并深入获取设备 ID。

我对使用设备 ID 进行唯一型号标识感兴趣,因为使用默认即插即用驱动程序的显示器将报告通用字符串作为显示器名称“默认即插即用显示器”

我一直遇到 WMI 方法的问题,它似乎只在我的 Vista 机器上返回 1 个显示器,查看 doco,结果发现它在非 WDDM 设备上无法按预期工作。

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

  • 有其他人必须做类似的事情(为所有连接的活动显示器找到唯一的型号字符串吗?)

  • 什么方法最有效?


这是我当前正在进行的代码,用于可靠地检测监视器设备 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++; 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EnumDisplayDevices 与 WMI Win32_DesktopMonitor,如何检测活动监视器? 的相关文章

随机推荐