views:

162

answers:

3

I am trying to retrieve the monitor ID's as shown in the Windows display properties (#1, 2... etc), but I can't seem to find a way. I have tried using EnumDisplayMonitors as well as EnumDisplayDevices. They both return something like "\.\DISPLAY1". However, this number doesn't always match the number shown by Windows, especially when 2 video cards are being used to drive 3 or more monitors. Is there an API call I am missing to retrieve this information, or is there a way to get it from the registry or somewhere else? Thanks!

I have tried these methods:
Win32: EnumDisplayMonitors, EnumDisplayDevices: Neither of these return monitors that aren't active, and neither one returns the correct IDs.
WMI: "select * from Win32_DesktopMonitor" doesn't return all the monitors, and there is no ID.
Registry: I have found the monitors in various locations, none of the places I found have the info I am looking for.

Any help is much appreciated. :)

Update: These are the monitor numbers I am looking for: alt text

+1  A: 

Just a guess, but it looks like Windows shows iDevNum+1 in Windows display properties.

Kirill V. Lyadvinsky
Unfortunately this isn't the case, that would be too easy. :) If you have a dual monitor system, try making #2 your primary and disabling #1. #2 will still be called number 2 in the Display Properties window, but it will be the first monitor returned by EnumDisplayDevices (iDevNum 0). :(
Jon Tackabury
Also, the order that monitors are returned by EnumDisplayMonitors appears to be random. Most of the time it will return them in the same order, but if you have 2 video cards driving 3 monitors, it can change around.
Jon Tackabury
This lead me down the right path, but isn't correct for Windows 7.
Jon Tackabury
A: 

Depending on the purpose, you might want to look toward a driver-based solution. I know nVidia have some decent libs that gives you access to most of the functions un the control pannel.

Phillaf
This is an interesting idea, but I need something more general purpose and can't depend on specific drivers.
Jon Tackabury
A: 

Did you make two calls to EnumDisplayDevices? Try something like:

while (EnumDisplayDevices(0, dev, &dd, 0))
{
...
  while (EnumDisplayDevices(dd.DeviceName, devMon, &ddMon, 0))
  {
   ...
  }
}
VitalyVal
I have done this, but where does the monitor number get returned?
Jon Tackabury
What do you mean by monitor number? If the mentioned "devMon", then start with devMon = 0, and make devMon++ in the internal "while".
VitalyVal
I have updated the question with a picture of the monitor numbers I am looking for.
Jon Tackabury