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

研究指出了2个选择

  • 使用WMI并向Win32_DesktopMonitor查询所有事件的监视器。使用PNPDeviceID来唯一标识监视器。
  • 使用EnumDisplayDevices API,然后向下挖掘以获取设备ID。

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

    我一直在遇到WMI方法的问题,看来我的Vista机器上只返回了1台显示器,看着doco证明它在非WDDM设备上无法正常工作。

    从后台服务(特别是在Vista中)运行时,EnumDisplayDevices似乎有点问题,如果它在 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/

    10-13 07:17