2016-12-21 20 views
0

Windows 7, 다중 모니터 구성 정보.EnumDisplayDevices의 링크 정보와 SetupDiOpenDevRegKey (EDID)

gcc-mingw-5.1.0 (실제로는 예상 값을 얻지 못하는 원인이 될 수 있음)을 사용하여 Linux (opensuse 13.1)와 크로스 컴파일합니다. 코드 :

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++; 
} 

출력 (강조 광산) :

내가 EnumDisplayDevices 모든 디스플레이 장치의 목록을 얻을.

0 -> \ \ 디스플레이 1
STR = 인텔 (R) HD 그래픽 4600
id = PCI \ VEN_8086 & DEV_0416 & SUBSYS_3 97817AA & REV_06
키 = \ 레지스트리 \ 장비 \ 시스템 \ CURRENTCONTROLSET \ \ 제어 \ {비디오 BBECD187-6CE4-47FD-915A-0000} A4952B2AC000
기본 = Y
-> BPP (32) = 1920 w = H = 1080 FPS = 60

1 -.> \ \ DISPLAY2
STR = 인텔 (R) HD 그래픽 4600
ID = PCI VEN_8086 & DEV_0416 & SUBSYS_397817AA & REV_06
키 \ = \ 레지스트리 \ 머신 \ 시스템 \ CurrentC ontrolSet \ 제어 \ {비디오 BBECD187-6CE4-47FD-915A-A4952B2AC000} = 0001
차 N
\ -> BPP = 32, H = 1,920 1,080 = 60 FPS

지금 = w this article

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... 
    } 
} 

출력 (의 일부) : 나는 각 모니터의 EDID 얻을 수 있습니다 ...


실측치 값 EDID '의 PnP 모니터 (표준) "
주요 경로'\ 레지스트리 \ 머신 \의 SYSTEM \ ControlSet001 \ 열거 \ DISPLAY \ LGD044F \ 4 개 & 1BDB7018 UID68092928의 \ 장치 파라미터 '

00 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
....

내 문제 지금, 두 정보를 어떻게 연결합니까? EDID를 디스플레이에 표시하려면 어떻게합니까?

이 예상 :.

\ \ 디스플레이 1 -

\> EDID1.\ DISPLAY2 -> EDID2

노트

  1. 디스플레이 # 1은 LG 모니터, 디스플레이 # 2는 델입니다 (예 : 설정 및 I 2 # 표시의 해상도를 변경할 때이 검증 될 수있다) 하지만 Dell 모니터의 EDID가 먼저 나타난 다음 LG의 EDID가 나타납니다. 따라서 두 열거 모두에서 나타나는 순서를 사용할 수 없으며 직접 연결되지 않습니다. 그렇지 않으면 질문하지 않습니다.

  2. 는 모든 모니터

  3. 내가 this question and its answer의 알고 있지만 DISPLAY_DEVICE을 기대하고 있기 때문에 허용 대답은 나에게 도움이되지 않습니다 동일한 수 있기 때문에 나는 또한, 해상도 정보 또는 동기화 속도에 의존 할 수 없다. 의 DeviceID는 HKLM \ 시스템 \ 등록 키 에 있어야합니다 \ CURRENTCONTROLSET 열거 \ 디스플레이와 제가 EnumDisplayDevices에서 얻을는 HKLM \ SYSTEM \ 에 \ \ CURRENTCONTROLSET 열거 \ PCI는 (의 "ID"줄을 볼 \ 출력).

  4. 플래그 EDD_GET_DEVICE_INTERFACE_NAME을 (를) advised in this question으로 사용하려고했지만 허용 된 답변에 표시된대로 deviceID가 표시되지 않습니다.

  5. how to get the key path

나는 list of SetupAPI functions을 확인했지만 표시 정보 및 SetupDiOpenDevRegKey의 결과를 연결하는 방법을 찾을 수 없습니다.

무엇을 놓쳤습니까? 어느 국기를 잘못 설정 했습니까? 어떻게 든 SetupDiOpenDevRegKey에 의해 반환 된 키 경로를 사용할 수 있습니까?

고마워요.

답변

0

는이 같은 각 디스플레이 두 번 EnumDisplayDevices 함수를 호출해야합니다 당신이 DISPLAY_DEVICE.DeviceID에서 예상 값을 받아 그 후 lpDevice=DisplayDevice.DeviceName

Getting the monitor's name with EnumDisplayDevices

lpDevice=NULL와 첫 번째 통화와 두 번째 전화를. 내 경우에는 다음 값을 갖는다 "MONITOR\DVAF001\{4d36e96e-e325-11ce-bfc1-08002be10"