链接来自EnumdisPlayDevices的信息与SetupDiopendEvregkey(EDID)的信息



Windows 7,多人配置。

在Linux(OpenSuse 13.1)上与GCC-MingW-5.1.0编译(实际上可能是我获得预期值的原因)。

我获得了所有显示设备的列表,其中 enumdisplaydevices :代码:

int DispNum = 0;
DISPLAY_DEVICE DisplayDevice;
DEVMODE defaultMode;
// initialize DisplayDevice
ZeroMemory(&DisplayDevice, sizeof(DisplayDevice));
DisplayDevice.cb = sizeof(DisplayDevice);
while (EnumDisplayDevices(NULL, DispNum, &DisplayDevice, EDD_GET_DEVICE_INTERFACE_NAME))
{
    ZeroMemory(&defaultMode, sizeof(DEVMODE));
    defaultMode.dmSize = sizeof(DEVMODE);
    if ((DisplayDevice.StateFlags & DISPLAY_DEVICE_ACTIVE) && (DisplayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) && !(DisplayDevice.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER)) {
        printf("%d -> %sntstr=%sntid=%sntkey=%sntprimary=%sn", DispNum,DisplayDevice.DeviceName, DisplayDevice.DeviceString,
            DisplayDevice.DeviceID, DisplayDevice.DeviceKey,
            (DisplayDevice.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) ? "y":"n");
        if (!EnumDisplaySettings((LPSTR)DisplayDevice.DeviceName, ENUM_CURRENT_SETTINGS, &defaultMode) ) {
            puts("EnumDisplaySettings failedn");
        } else {
            printf("    -> bpp=%d w=%d h=%d fps=%dn",
                (int)defaultMode.dmBitsPerPel, (int)defaultMode.dmPelsWidth,
                (int)defaultMode.dmPelsHeight, (int)defaultMode.dmDisplayFrequency);
        }
    }
    // Reinit DisplayDevice just to be extra clean
    ZeroMemory(&DisplayDevice, sizeof(DisplayDevice));
    DisplayDevice.cb = sizeof(DisplayDevice);
    DispNum++;
}

输出(强调我的):

0-> 。 display1
str = intel(r)高清图形4600
id = pci ven_8086& dev_0416& subsys_397817aa&rev_06
key = 注册表 Machine System CurrentControlset Control Video {BBECD187-6CE4-47FD-915A-A4952B2AC000} 0000
primary = y
-> bpp = 32 W = 1920 H = 1080 fps = 60

1-> 。 display2
str = intel(r)高清图形4600
id = pci ven_8086& dev_0416& subsys_397817aa&rev_06
key = registry Machine System CurrentControlset Control Video {BBECD187-6CE4-47FD-915A-A4952B2AC000} 0001
primary = n
-> bpp = 32 W = 1920 H = 1080 fps = 60

现在,有了这篇文章,我可以得到每个监视器的EDID:

const GUID GUID_CLASS_MONITOR = {0x4d36e96e, 0xe325, 0x11ce, 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18};
HDEVINFO devInfo = NULL;
SP_DEVINFO_DATA devInfoData;
ULONG i = 0;
devInfo = SetupDiGetClassDevsEx(
    &GUID_CLASS_MONITOR, //class GUID
    NULL,NULL,
    DIGCF_PRESENT,
    NULL,NULL,NULL);
if (NULL == devInfo)
return -1;
for (i=0;ERROR_NO_MORE_ITEMS != GetLastError();i++) {
    memset(&devInfoData,0,sizeof(devInfoData));
    devInfoData.cbSize = sizeof(devInfoData);
    if (SetupDiEnumDeviceInfo(devInfo,i,&devInfoData))
    {
        // look for EDID with SetupDiOpenDevRegKey + RegEnumValue...
    }
}

输出(其中一部分):

...
找到了" PNP-Monitor(标准)"'
的值 关键路径为' Incorpristr Machine System controlSet001 Enum Display LGD044F 4& 1BDB7018& 0& uid68092928
00 ff ff ff ff ff ff ff ff 00 26 07 01 00 e7 03 00 00
00 1A 01 03 80 00 00 00 02 00 00 00 00 00 00 00 00 00
....

我的问题是现在,如何链接两个信息?我如何将EDID归因于显示?

预期:

。 display1-> edid1

。 display2-> edid2

笔记

  1. 显示#1是一个LG监视器,显示#2是dell(设置为此,可以在更改Disling#2的分辨率时可以验证,但是Dell Monitor的EDID首先出现然后是LG的Edid。因此,我不能在两项枚举中使用外观顺序,它们不是直接链接的(否则没有问题)。

  2. i也不能依靠分辨率信息或同步率,因为所有监视器可能相同

  3. 我知道这个问题及其答案,但是所接受的答案对我没有帮助,因为它期望 display_device.deviceid 在reg键 hklm system system CurrentControlset Enum display 以及我从 enumdisPlayDevices 中获得的内容,位于 hklm system currentcontrolset enum enum pci 中输出)。

  4. 我尝试使用此问题中建议的flag edd_get_device_interface_name

  5. 如何获取密钥路径

我已经检查了设置功能列表,但找不到如何连接显示信息和setupdiopendevregkey的结果。

我想念什么?我设定了哪个标志?我可以以某种方式使用setupdiopendevregkey返回的关键路径?

非常感谢。

您需要为每个显示两次调用EnumDisplayDevices功能,如以下:使用EnumdisPlayDevices

获取显示器的名称

第一次使用lpDevice=NULL呼叫,第二次通话lpDevice=DisplayDevice.DeviceName

之后,您在display_device.deviceid中收到了预期值。对于我的情况,它具有下一个值"MONITORDVAF001{4d36e96e-e325-11ce-bfc1-08002be10"

相关内容

  • 没有找到相关文章

最新更新