2016-12-21 14 views
0

Windows 7、マルチモニタ構成。SetupDiOpenDevRegKey(EDID)の情報をEnumDisplayDevicesからのリンク情報

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 - > \ \ DISPLAY1
STR = Intel(R)HDグラフィックス4600
id = PCI \ VEN_8086 & DEV_0416 & SUBSYS_3 97817AA & REV_06
キー= \レジストリ\マシン\システム\ CURRENTCONTROLSET \コントロール\ビデオ{BBECD187-6CE4-47FD-915A-A4952B2AC000} 0000
プライマリ= Y
\ - > BPP = 32、W = 1920、H = 1080 FPS = 60

1 - 。> \ \にてDisplay
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と1920、H = 1080 FPS = 60

今= 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を取得することができます210実測値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の属性を付けるにはどうすればいいですか?

期待

\ \ DISPLAY1 - > EDID1

\。。\にてDisplay - > EDID2

ノート

  1. 表示#1は、LGのモニタは、表示#2はデルである(のようなセットアップと私は2表示#の解像度を変更すると、これは確認することができます) 、DellのモニタのEDIDが最初に表示され、次にLGのEDIDが表示されます。 したがって、両方の列挙で出現順序を使用することはできませんが、直接リンクされていません(そうでなければ質問する必要はありません)。

  2. それはすべてのモニタ

  3. 私はthis question and its answerの承知していますが、それはDISPLAY_DEVICEを期待するので受け入れ答えは、私を助けていないため、同じかもしれないので、私はまた、解像度情報または同期率に依存することはできません。 HKLM \システム\ CURRENTCONTROLSET \ Enumの\のDISPLAYと私はEnumDisplayDevicesから取得がHKLM \システム\ CURRENTCONTROLSET \ Enumの\ \ である\ REGキーにPCIするをDEVICEID(で "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で期待値を受け取った後 Getting the monitor's name with EnumDisplayDevices

lpDevice=DisplayDevice.DeviceName

lpDevice=NULLとの最初の呼び出しと2回目の呼び出し。私の場合は次の値を持っています"MONITOR\DVAF001\{4d36e96e-e325-11ce-bfc1-08002be10"

関連する問題