// This enumerates all turned on, physical monitors in the system and returns them // Will return an empty list if none found or on fail public static IList<MonitorDisplayArea> EnumerateDisplayAreas() { // first, iterate over all display devices and find the physical monitor device for each display device (if there is one) var monitors = new List<MonitorDisplayArea>(); uint numDevicesEnumerated = 0; var device = new DisplayDevice(); device.Init(); while(DisplayEnumerationAreaExterns.EnumDisplayDevices(null, numDevicesEnumerated, ref device, 0)) { numDevicesEnumerated++; uint numMonitorsEnumerated = 0; var displayMonitor = new DisplayDevice(); displayMonitor.Init(); while(DisplayEnumerationAreaExterns.EnumDisplayDevices(device.DeviceName, numMonitorsEnumerated, ref displayMonitor, 0)) { numMonitorsEnumerated++; if((displayMonitor.StateFlags & DisplayDeviceStateFlags.Active) == 0 || (displayMonitor.StateFlags & DisplayDeviceStateFlags.MirroringDriver) != 0) { // this monitor is not turned on, or it is not an actual physical monitor continue; } var displayMonitorInterface = new DisplayDevice(); displayMonitorInterface.Init(); if(!DisplayEnumerationAreaExterns.EnumDisplayDevices(device.DeviceName, numMonitorsEnumerated-1, ref displayMonitorInterface, EnumDisplayDevicesFlags.GetDeviceInterfaceName)) { return new List<MonitorDisplayArea>(); // something broke } // store the relevant monitor information we have in the output struct and add to list var displayArea = new MonitorDisplayArea(); displayArea.displayDeviceName = device.DeviceName; int start = displayMonitorInterface.DeviceID.IndexOf("DISPLAY"); int stop = displayMonitorInterface.DeviceID.IndexOf('{'); if(start == -1 || stop == -1) return new List<MonitorDisplayArea>(); displayArea.monitorId = displayMonitorInterface.DeviceID.Substring(start, stop - start - 1).Replace("#", "\\").ToUpperInvariant(); monitors.Add(displayArea); break; // this is correct if there is really only one physical monitor per display device } } // get the virtual desktop bounds of each monitor DisplayEnumerationAreaExterns.EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, (IntPtr hMonitor, IntPtr hdcMonitor, ref Rect lprcMonitor, IntPtr dwData) => { var monitorInfo = new MonitorInfoEx(); monitorInfo.Init(); if(DisplayEnumerationAreaExterns.GetMonitorInfo(hMonitor, ref monitorInfo)) { var monitor = monitors.SingleOrDefault(mda => mda.displayDeviceName.Equals(monitorInfo.szDevice)); if(monitor != null) { monitor.xVirtual = monitorInfo.rcMonitor.Left; monitor.yVirtual = monitorInfo.rcMonitor.Top; monitor.wVirtual = monitorInfo.rcMonitor.Right - monitorInfo.rcMonitor.Left; monitor.hVirtual = monitorInfo.rcMonitor.Bottom - monitorInfo.rcMonitor.Top; } } return true; } , IntPtr.Zero); return monitors; }
public static extern bool EnumDisplayDevices(string lpDevice, uint iDevNum, ref DisplayDevice lpDisplayDevice, EnumDisplayDevicesFlags dwFlags);