Getting aspect ratio of a monitor

Started by
20 comments, last by Lightrocker 19 years, 11 months ago
Nice find, that's much nicer than mucking around with V86 + the VESA calls But mother mary, 13 nested blocks - ouch
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]
E8 17 00 42 CE DC D2 DC E4 EA C4 40 CA DA C2 D8 CC 40 CA D0 E8 40E0 CA CA 96 5B B0 16 50 D7 D4 02 B2 02 86 E2 CD 21 58 48 79 F2 C3
Advertisement
Am I the only one who thinks those code boxes suck?

and for the record, I have a 16x10 aspect ratio monitor (Sony GDM-FW900)

-=[ Megahertz ]=-
-=[Megahertz]=-

This topic is closed to new replies.

Advertisement