/// <summary>
        /// Retrieve display settings.
        /// </summary>
        /// <param name="displayIndex">Index of the display/adapter of interest.</param>
        /// <param name="type">Whether to retrieve the currently active settings or those stored in the registry for that display/adapter.</param>
        public static DisplaySettings GetDisplaySettings(int displayIndex, SettingsType type = SettingsType.Current)
        {
            displayIndex = Math.Max(displayIndex, 0);

            DISPLAY_DEVICE d  = DISPLAY_DEVICE.Create();
            DEVMODE        dm = DEVMODE.Create();

            EnumDisplayDevices(null, (uint)displayIndex, ref d, 1);
            var isAttached = ((DisplayInformation.DisplayDeviceStateFlags)d.StateFlags).HasFlag(DisplayInformation.DisplayDeviceStateFlags.AttachedToDesktop);

            EnumDisplaySettingsEx(d.DeviceName, (int)type, ref dm, 0);

            var displaySettings = new DisplaySettings()
            {
                DisplayIndex = displayIndex,
                Mode         = new GraphicsMode
                {
                    Width       = (int)dm.dmPelsWidth,
                    Height      = (int)dm.dmPelsHeight,
                    RefreshRate = (int)dm.dmDisplayFrequency,
                    BitDepth    = (int)dm.dmBitsPerPel
                },
                DesktopPosition = new Position {
                    X = dm.dmPosition.x, Y = dm.dmPosition.y
                },
                IsAttached = isAttached
            };

            // Find mode number
            displaySettings.Mode.Index = -1;
            for (int iModeNum = 0; EnumDisplaySettingsEx(d.DeviceName, iModeNum, ref dm, 0) != 0; iModeNum++)
            {
                var isModeMatch = displaySettings.Mode.Width == dm.dmPelsWidth &&
                                  displaySettings.Mode.Height == dm.dmPelsHeight &&
                                  displaySettings.Mode.RefreshRate == dm.dmDisplayFrequency &&
                                  displaySettings.Mode.BitDepth == dm.dmBitsPerPel;

                if (isModeMatch)
                {
                    displaySettings.Mode.Index = iModeNum;
                    break;
                }
            }

            return(displaySettings);
        }
        /// <summary>
        /// Change settings of a display.
        /// </summary>
        /// <param name="displaySettings">The settings to apply.</param>
        /// <returns>Result of the operation including a description.</returns>
        public static DisplaySettingsChangedResult ChangeDisplaySettings(DisplaySettings displaySettings)
        {
            displaySettings.DisplayIndex = Math.Max(displaySettings.DisplayIndex, 0);

            DISPLAY_DEVICE d  = DISPLAY_DEVICE.Create();
            DEVMODE        dm = DEVMODE.Create();

            EnumDisplayDevices(null, (uint)displaySettings.DisplayIndex, ref d, 1);

            if (0 != EnumDisplaySettingsEx(d.DeviceName, ENUM_CURRENT_SETTINGS, ref dm, 0))
            {
                dm.dmPelsWidth        = (uint)displaySettings.Mode.Width;
                dm.dmPelsHeight       = (uint)displaySettings.Mode.Height;
                dm.dmDisplayFrequency = (uint)displaySettings.Mode.RefreshRate;
                dm.dmBitsPerPel       = (uint)displaySettings.Mode.BitDepth;
                dm.dmPosition.x       = displaySettings.DesktopPosition.X;
                dm.dmPosition.y       = displaySettings.DesktopPosition.Y;

                int iRet = ChangeDisplaySettingsEx(d.DeviceName, ref dm, IntPtr.Zero, ChangeDisplaySettingsFlags.CDS_TEST, IntPtr.Zero);

                if (iRet == (int)DisplaySettingsChangedResult.ChangeStatus.FAILED)
                {
                    return(new DisplaySettingsChangedResult(iRet));
                }
                else
                {
                    iRet = ChangeDisplaySettingsEx(d.DeviceName, ref dm, IntPtr.Zero, ChangeDisplaySettingsFlags.CDS_UPDATEREGISTRY, IntPtr.Zero);

                    return(new DisplaySettingsChangedResult(iRet));
                }
            }
            else
            {
                return(new DisplaySettingsChangedResult(DisplaySettingsChangedResult.ChangeStatus.BADMODE));
            }
        }