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