c++ - EnumDisplayDevices vs WMI Win32_DesktopMonitor,如何检测事件监视器?

标签 c++ windows winapi wmi

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

研究指出了两种选择

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

  2. 使用 EnumDisplayDevices API,向下挖掘以获取设备 ID。

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

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

EnumDisplayDevices 从后台服务(尤其是在 Vista 上)运行时似乎有点问题,如果它在 session 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++; 
}

关于c++ - EnumDisplayDevices vs WMI Win32_DesktopMonitor,如何检测事件监视器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/181064/

相关文章:

c++ - 将位数组转换为 HBITMAP 后 bmBits 的 NULL 指针

c++ - 如何使用 Win32/MFC API 提取 .iso 文件?

c++ - 如何编写 std::codecvt 方面?

windows - 如何在用户不活动一段时间后锁定应用程序?

c++ - gcc7 中的枚举和三元奇怪行为

c++ - float 编辑框

c++ - DLL 可以调用/加载另一个 DLL 吗?

java - 如何从 Java 访问 Windows 设备管理器中的信息?

c++ - 在 C 中存储对 Lua 值的引用,如何实现?

java - ISO C++ 禁止声明没有类型的 'init' [-fpermissive]