// NOTE: this function returns True if the display settings can be set, False otherwise // NOTE: this _might_ let us detect if a display change requires a reboot (although we don't yet return a result indicating that reality) public static Boolean TestDisplaySettings(String displayAdapterName, DisplaySettings settings) { var displayAdapterNameAsCharArray = ConvertStringToNullTerminatedCharArray(displayAdapterName); var devmode = settings.devmode; var result = WindowsApi.ChangeDisplaySettingsEx(displayAdapterNameAsCharArray, ref devmode, IntPtr.Zero, (UInt32)WindowsApi.ChangeDisplaySettingsFlags.CDS_TEST, IntPtr.Zero); switch (result) { case WindowsApi.DISP_CHANGE_RESULT.DISP_CHANGE_SUCCESSFUL: return(true); //case WindowsApi.DISP_CHANGE_RESULT.DISP_CHANGE_RESTART: default: return(false); } }
// NOTE: this function throws an exception if the settings could not be set successfully public static void SetCurrentDisplaySettings(String displayAdapterName, DisplaySettings settings) { /* OPTIONAL FLAGS: * CDS_GLOBAL | CDS_UPDATEREGISTRY // save the updated resolution for all users * CDS_RESET // update the settings even if they're the same as the current settings * CDS_SET_PRIMARY // make this display adapter the primary display adapter * CDS_TEST // tests if the change would be valid [NOTE: this _might_ let us detect if a display change requires a reboot] * CDS_UPDATEREGISTRY // save the display change in the system registry (for the user, unless also using CDS_GLOBAL) * CDS_DISABLE_UNSAFE_MODES // prohibits us from accidentally using unsafe display modes */ var displayAdapterNameAsCharArray = ConvertStringToNullTerminatedCharArray(displayAdapterName); var devmode = settings.devmode; var result = WindowsApi.ChangeDisplaySettingsEx(displayAdapterNameAsCharArray, ref devmode, IntPtr.Zero, 0, IntPtr.Zero); switch (result) { case WindowsApi.DISP_CHANGE_RESULT.DISP_CHANGE_SUCCESSFUL: return; default: throw new Exception("Could not change screen settings; result: " + result); } }