public static List <DisplayAdapterMonitorInfo> GetAllMonitorsForDisplayAdapter(String displayAdapterName)
        {
            var result = new List <DisplayAdapterMonitorInfo>();

            var displayAdapterNameAsCharArray = ConvertStringToNullTerminatedCharArray(displayAdapterName);

            // get the monitors associated with this display adapter
            UInt32 iMonitor = 0;
            //
            var success = true;

            while (success == true)
            {
                var cDisplayDevice = new WindowsApi.DISPLAY_DEVICEW();
                cDisplayDevice.Init();

                success = WindowsApi.EnumDisplayDevices_Monitor(displayAdapterNameAsCharArray, iMonitor, ref cDisplayDevice, 0);
                if (success == false)
                {
                    break;
                }

                var monitorDeviceNameAsString   = Display.ConvertCharArrayToString(cDisplayDevice.DeviceName);
                var monitorDeviceStringAsString = Display.ConvertCharArrayToString(cDisplayDevice.DeviceString);
                var monitorStateFlags           = (UInt32)cDisplayDevice.StateFlags;

                Boolean isAttached = false;
                if ((monitorStateFlags & (UInt32)WindowsApi.ChildDisplayDeviceStateFlags.DISPLAY_DEVICE_ATTACHED) != 0)
                {
                    isAttached = true;
                }
                // if the monitor is not attached, do not include it in the enumeration; we may modify this logic in the future if/as desired
                if (isAttached == false)
                {
                    iMonitor += 1;
                    continue;
                }

                Boolean isActive = false;
                if ((monitorStateFlags & (UInt32)WindowsApi.ChildDisplayDeviceStateFlags.DISPLAY_DEVICE_ACTIVE) != 0)
                {
                    isActive = true;
                }

                var monitorInfo = new DisplayAdapterMonitorInfo(monitorDeviceNameAsString, monitorDeviceStringAsString, isActive);

                result.Add(monitorInfo);

                iMonitor += 1;
            }

            return(result);
        }
        public static List <DisplayAdapterInfo> GetAllDisplayAdapters()
        {
            var result = new List <DisplayAdapterInfo>();

            // get a list of all display adapters
            UInt32 iDisplayAdapter = 0;
            //
            var success = true;

            while (success == true)
            {
                var cDisplayDevice = new WindowsApi.DISPLAY_DEVICEW();
                cDisplayDevice.Init();

                success = WindowsApi.EnumDisplayDevices_DisplayAdapter(IntPtr.Zero, iDisplayAdapter, ref cDisplayDevice, 0);
                if (success == false)
                {
                    break;
                }

                // verify that the device is attached to the desktop
                if ((UInt32)(cDisplayDevice.StateFlags & WindowsApi.DisplayDeviceStateFlags.DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) == 0)
                {
                    iDisplayAdapter += 1;
                    continue;
                }
                // verify that the device is not a mirroring psuedodevice
                if ((UInt32)(cDisplayDevice.StateFlags & WindowsApi.DisplayDeviceStateFlags.DISPLAY_DEVICE_MIRRORING_DRIVER) != 0)
                {
                    iDisplayAdapter += 1;
                    continue;
                }

                var deviceNameAsCharArray = cDisplayDevice.DeviceName;
                var deviceNameAsString    = ConvertCharArrayToString(deviceNameAsCharArray);

                var isPrimaryDisplayAdapter = false;
                if ((UInt32)(cDisplayDevice.StateFlags & WindowsApi.DisplayDeviceStateFlags.DISPLAY_DEVICE_PRIMARY_DEVICE) != 0)
                {
                    isPrimaryDisplayAdapter = true;
                }

                var displayAdapterInfo = new DisplayAdapterInfo(deviceNameAsString, isPrimaryDisplayAdapter);
                result.Add(displayAdapterInfo);

                iDisplayAdapter += 1;
            }

            return(result);
        }