/// <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()); }
/// <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)); } }