views:

480

answers:

4

I need a way to programatically detect whether the monitor is wide or not, in Windows.

GetSystemMetrics returns the size of the desktop, which sort of works, but if an user has a widescreen monitor at, say, 1024x768, I'll incorrectly classify it as non-wide.

GetDeviceCaps has similar problems with HORZRES and VERTRES, and even HORZSIZE AND VERTSIZE give incorrect results when a non-wide resolution is used in a wide monitor.

Is there any way to detect this reliably?

A: 

try SystemInformation.PrimaryMonitorSize

callisto
That gets the dimensions of the current video mode.
Robert Harvey
+3  A: 

You might be able to get the actual physical size through EDID. See here: http://stackoverflow.com/questions/577736/how-to-obtain-the-correct-physical-size-of-the-monitor/579448#579448

Robert Harvey
A: 

The sensible thing would be to classify monitors by width to height proportion. That's what I see a lot of games doing these days.

If you can get the width, then you can probably get the height. After that, the answer is only one little math operation away.

T.E.D.
Windows typically reports the size of the current video mode, whcih does not necessarily correspond to the physical monitor's aspect ratio.
Robert Harvey
Good point. However, I have lately seen games reporting certian resolutions as "widscreen" on their video settings. Surely you could do the same?
T.E.D.
Standard aspect is 4:3 - what humans like to look at.Widescreen is generally 16:9.Crude rule of thumb: If its not 4:3 assume that it is widescreen. Before widescreen pretty much all the modes matched the 4:3 rule.
Stephen Kellett
+1  A: 

Here is a better version that doesn't mess with the EDID or the registry. It makes the assumption (which is IMHO quite accurate) that the maximum resolution supported by the display is the best native fit.

DEVMODEA modeInfo;
modeInfo.dmSize = sizeof(DEVMODEA);
modeInfo.dmDriverExtra = NULL;
int modeNum = 0;
int xMax = 0, yMax = 0;
while (EnumDisplaySettingsExA(0, modeNum, &modeInfo, 0)) {
 ++modeNum;
 if (modeInfo.dmPelsWidth > xMax) {
  xMax = modeInfo.dmPelsWidth;
  yMax = modeInfo.dmPelsHeight;
 }
}
cout << "Monitor aspect ratio : " << (double)xMax/yMax << "\n";

Cheers.

Bill Kotsias