2016-12-21 2 views
0

Конфигурации Windows 7, мультимониторы.Информация о связи с EnumDisplayDevices с информацией от SetupDiOpenDevRegKey (EDID)

Перекресток, скомпилированный по 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 -> %s\n\tstr=%s\n\tid=%s\n\tkey=%s\n\tprimary=%s\n", 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 failed\n"); 
     } else { 
      printf(" -> bpp=%d w=%d h=%d fps=%d\n", 
       (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++; 
} 

Output (курсив мой.): ​​

0 -> \ \ DISPLAY1
ул = Intel (R) HD Graphics 4600
ID = PCI \ VEN_8086 & DEV_0416 & SUBSYS_3 97817AA & REV_06
ключ = \ Registry \ Machine \ System \ CurrentControlSet \ Control \ Video {BBECD187-6CE4-47FD-915A-A4952B2AC000} \ 0000
первичного = у
-> BPP = 32 Вт = 1920 ч = 1080 кадров в секунду = 60

1 -.> \ \ DISPLAY2
ул = Intel (R) HD Graphics 4600
ID = PCI \ VEN_8086 & DEV_0416 & SUBSYS_397817AA & REV_06
ключ = \ Registry \ Machine \ система \ CurrentC ontrolSet \ Control \ Видео {BBECD187-6CE4-47FD-915A-A4952B2AC000} \ 0001
первичным = п
-> БПП = 32 Вт = 1920 ч = 1080 кадров в секунду = 60

Теперь, с this article Я могу получить 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... 
    } 
} 

Output (часть):

...
Найдено значение EDID для 'PnP-Monitor (Standard)'
Key путь '\ REGISTRY \ MACHINE \ SYSTEM \ ControlSet001 \ Enum \ DISPLAY \ LGD044F \ 4 & 1BDB7018 UID68092928 \ Параметры устройства'

00 FF FF FF FF FF FF 00 26 07 01 00 03 00 e7 00
00 1a 03 80 01 00 00 00 02 00 00 00 00 00 00 00
....

Моя проблема в настоящее время, как связать обе информации? Как привязать EDID к дисплею?

Ожидаемое:.

\ \ DISPLAY1 -> EDID1

\.\ DISPLAY2 -> EDID2

Примечание

  1. Дисплей # 1 является монитором LG, дисплей # 2 является Dell (установка как таковые, и это может быть проверено, когда я изменить разрешение 2 Display #) , но сначала появится EDID для монитора Dell, а затем EDID LG. Поэтому я не могу использовать порядок появления в обоих перечислениях, они не связаны напрямую (в противном случае вопрос не задавать).

  2. Я также не могу полагаться на информацию о разрешении или синхронизации скорости, так как это может быть одинаковым для всех мониторов

  3. Я знаю this question and its answer, но принятый ответ мне не помогает, так как он ожидает DISPLAY_DEVICE. DeviceID быть в ключе Изотерм \ HKLM \ System \ CurrentControlSet \ Enum \ DISPLAY и то, что я получаю от EnumDisplayDevices находится в \ HKLM \ System \ CurrentControlSet \ Enum \ PCI (см "ID" строки в выход).

  4. Я попытался использовать флаг EDD_GET_DEVICE_INTERFACE_NAME как advised in this question, но я не получил идентификатор устройства, как показано в принятом ответе.

  5. how to get the key path

Я проверил list of SetupAPI functions но не смог найти, как подключить отображаемую информацию и результат SetupDiOpenDevRegKey.

Что я пропустил? Какой флаг я допустил неправильно? Можно каким-то образом использовать путь ключа, возвращаемый SetupDiOpenDevRegKey?

Большое спасибо.

ответ

0

Вы должны вызвать функцию EnumDisplayDevices дважды для каждого дисплея, например: Getting the monitor's name with EnumDisplayDevices

Первый вызов с lpDevice=NULL и второй вызов с lpDevice=DisplayDevice.DeviceName

После того, что вы получили ожидаемое значение в DISPLAY_DEVICE.DeviceID. Для моего случая оно имеет следующее значение "MONITOR\DVAF001\{4d36e96e-e325-11ce-bfc1-08002be10"

Смежные вопросы