/// <summary>
        /// List all graphics modes supported by a display.
        /// </summary>
        /// <param name="displayIndex">Index of the display/adapter of interest.</param>
        public static GraphicsMode[] EnumerateAllDisplayModes(int displayIndex)
        {
            var displayModes = new List <GraphicsMode>();

            displayIndex = Math.Max(displayIndex, 0);

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

            EnumDisplayDevices(null, (uint)displayIndex, ref d, 1);

            for (int iModeNum = 0; EnumDisplaySettingsEx(d.DeviceName, iModeNum, ref dm, 0) != 0; iModeNum++)
            {
                displayModes.Add(new GraphicsMode
                {
                    Index       = iModeNum,
                    Width       = (int)dm.dmPelsWidth,
                    Height      = (int)dm.dmPelsHeight,
                    RefreshRate = (int)dm.dmDisplayFrequency,
                    BitDepth    = (int)dm.dmBitsPerPel
                });
            }

            return(displayModes.ToArray());
        }
예제 #2
0
        /// <summary>
        /// Returns list of physical display rectangles(without considering DPI).
        /// X and Y can be negative.
        /// </summary>
        /// <returns></returns>
        public static IReadOnlyCollection <Rectangle> GetPhysicalScreens()
        {
            var list = new List <Rectangle>();

            bool Callback(nint hDesktop, nint hdc, ref RECT rect, nint dwData)
            {
                var info = Interop.User32.MonitorInfoEx.Create();

                Interop.User32.GetMonitorInfo(hDesktop, ref info).Check();

                var settings = DEVMODE.Create();

                User32.EnumDisplaySettings(
                    info.szDevice,
                    User32.ENUM_CURRENT_SETTINGS,
                    ref settings);

                var x      = settings.dmPosition.x;
                var y      = settings.dmPosition.y;
                var width  = settings.dmPelsWidth;
                var height = settings.dmPelsHeight;

                list.Add(new Rectangle(x, y, (int)width, (int)height));

                return(true);
            }

            Interop.User32.EnumDisplayMonitors(0, 0, Callback, 0).Check();

            return(list);
        }
    public void EnumDisplaySettingsEx_Test()
    {
        // Arrange
        var mode = DEVMODE.Create();

        // Act
        var result = EnumDisplaySettingsEx(null, ENUM_CURRENT_SETTINGS, ref mode, EnumDisplaySettingsExFlags.EDS_RAWMODE);

        // Assert
        Assert.True(result);
        Assert.True(mode.dmPelsWidth > 0);
        Assert.True(mode.dmPelsHeight > 0);
    }
        /// <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));
            }
        }