Esempio n. 1
0
        // 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;
        }
Esempio n. 2
0
 public static extern bool EnumDisplayDevices(string lpDevice, uint iDevNum, ref DisplayDevice lpDisplayDevice, EnumDisplayDevicesFlags dwFlags);