Here's a cleaned-up version - only 5 levels
// useful for determining aspect ratio. not called by detect().// if we fail, outputs are unchanged (assumed initialized to defaults)int get_monitor_size(int& width_cm, int& height_cm){ DISPLAY_DEVICE adapter = { sizeof(DISPLAY_DEVICE) }; DISPLAY_DEVICE monitor = { sizeof(DISPLAY_DEVICE) }; // need to be distinct (EnumDisplayDevices requirement) LONG err; char key_name[256]; DWORD key_name_len; DWORD key_type; bool found = false; // make sure EnumDisplayDevices is available (as pEnumDisplayDevicesA) TRY(import_EnumDisplayDevices()); HKEY hkDisplay; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Enum\\Display", 0, KEY_READ, &hkDisplay) != 0) return -1; // we only look at the first monitor of the first display adapter // attached to the desktop, assumed to be the primary monitor. // for each display adapter for(int adapter_idx = 0; !found; adapter_idx++) { // get display adapter if(!pEnumDisplayDevicesA(0, adapter_idx, &adapter, 0)) break; if(!(adapter.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) continue; // get its associated monitor; // will search for its DeviceID in the registry if(!pEnumDisplayDevicesA(adapter.DeviceName, 0, &monitor, 0)) continue; // for each class in registry for(int class_idx = 0; !found; class_idx++) { // open next key HKEY hkClass; key_name_len = sizeof(key_name); if(RegEnumKeyEx(hkDisplay, class_idx, key_name, &key_name_len, 0, 0, 0, 0) != 0) break; if(RegOpenKeyEx(hkDisplay, key_name, 0, KEY_READ, &hkClass) != 0) break; // for each device in registry for(int dev_idx = 0; !found; dev_idx++) { // open next key HKEY hkDev; key_name_len = sizeof(key_name); if(RegEnumKeyEx(hkClass, dev_idx, key_name, &key_name_len, 0, 0, 0, 0) != 0) break; if(RegOpenKeyEx(hkClass, key_name, 0, KEY_READ, &hkDev) != 0) break; // build dev_id: (%s\\%s, HardwareID, Driver) // example: "Monitor\NEC6604\{4D36E96E-E325-11CE-BFC1-08002BE10318}\0001" // will compare this against monitor.DeviceID char dev_id[256]; DWORD dev_id_len = sizeof(dev_id); err = RegQueryValueEx(hkDev, "HardwareID", 0, &key_type, (BYTE*)dev_id, &dev_id_len); if(err != 0 || (key_type != REG_MULTI_SZ && key_type != REG_SZ)) goto skip_dev; char* p = (char*)dev_id + strlen((const char*)dev_id); *p++ = '\\'; dev_id_len = sizeof(dev_id) - dev_id_len; err = RegQueryValueEx(hkDev, "Driver", 0, &key_type, (BYTE*)p, &dev_id_len); if(err != 0 || (key_type != REG_MULTI_SZ && key_type != REG_SZ)) goto skip_dev; // this (hkDev) is not the monitor you're looking for.. if(strcmp(monitor.DeviceID, (const char*)dev_id) != 0) goto skip_dev; HKEY hkDevParams; if(RegOpenKeyEx(hkDev, "Device Parameters", 0, KEY_READ, &hkDevParams) != 0) goto skip_dev; // read EDID BYTE edid[256]; DWORD edid_len = sizeof(edid); if(RegQueryValueEx(hkDevParams, "EDID", 0, &key_type, edid, &edid_len) == 0) { width_cm = edid[21]; height_cm = edid[22]; found = true; // break out of all loops; all keys will be closed } RegCloseKey(hkDevParams); skip_dev: RegCloseKey(hkDev); } RegCloseKey(hkClass); } } RegCloseKey(hkDisplay); return found? 0 : -1;}
// edit: -code +source
[edited by - Jan Wassenberg on April 27, 2004 12:45:38 PM]