Windows 7中,多監視器配置。鏈接信息從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++;
}
輸出(重點煤礦):
0 - > \ \ DISPLAY1
海峽=英特爾(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 - > \ \ DISPLAY2
STR =英特爾(R)HD圖形4600
ID = PCI \ VEN_8086 & DEV_0416 & SUBSYS_397817AA & REV_06
鍵= \註冊表\機\ SYSTEM \ CurrentC ontrolSet \控制\視頻{BBECD187-6CE4-47FD-915A-A4952B2AC000} \ 0001
初級=正
- > BPP = 32 W = 1920,H = 1080 FPS = 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...
}
}
輸出(一部分):
...
爲實測值EDID '的PnP-監視器(標準)'
關鍵路徑是 '\ REGISTRY \ MACHINE \ SYSTEM \ ControlSet001 \枚舉\ DISPLAY \ LGD044F \ 4個& 1BDB7018 UID68092928 \設備參數'
00 FF FF FF FF FF FF 00 26 07 01 00 03 E7 00 00
00 1A 01 03 80 00 00 00 02 00 00 00 00 00 00 00
....
我的問題是,現在,我如何鏈接這兩個信息?我如何將EDID歸屬於顯示器?
預計:
\ \ DISPLAY1 - > EDID1
\。\ DISPLAY2 - > EDID2
注
顯示#1是LG顯示器,顯示#2是戴爾(設置爲這樣,這可以當我改變的顯示#2分辨率來驗證) ,但戴爾顯示器的EDID首先出現,然後出現LG的EDID。 因此,我不能在兩個枚舉中使用外觀順序,它們不是直接鏈接的(否則沒有問題要問)。
我也不能依靠消除信息同步速率,因爲它可以是相同的所有監視器
我知道this question and its answer但因爲它預計DISPLAY_DEVICE接受的答案並不能幫助我。的DeviceID是在REG關鍵\ HKLM \系統\ CurrentControlSet \枚舉\ DISPLAY和我從EnumDisplayDevices得到是\ HKLM \系統\ CurrentControlSet \枚舉\ PCI(見 「ID」 行輸出)。
我試圖使用標誌EDD_GET_DEVICE_INTERFACE_NAME作爲 advised in this question,但我沒有得到deviceID,如接受的答案中所示。
我已經檢查了list of SetupAPI functions但無法找到如何連接顯示信息和SetupDiOpenDevRegKey的結果。
我錯過了什麼?我錯了哪個標誌?可以以某種方式使用SetupDiOpenDevRegKey返回的Key路徑?
非常感謝。