From 62d00fcfd59edbf16a36773a14016eaba5bd3bf3 Mon Sep 17 00:00:00 2001 From: bbj233 <103881494+bbj233@users.noreply.github.com> Date: Fri, 11 Sep 2026 07:06:34 +0800 Subject: [PATCH] Fix restoring native resolution from DSR modes --- Source/AutoActions.Displays/DisplayManagerBase.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Source/AutoActions.Displays/DisplayManagerBase.cs b/Source/AutoActions.Displays/DisplayManagerBase.cs index 45d08b3..8743571 100644 --- a/Source/AutoActions.Displays/DisplayManagerBase.cs +++ b/Source/AutoActions.Displays/DisplayManagerBase.cs @@ -282,6 +282,14 @@ public void SetResolution(Display display, Size resolution) { dm.dmPelsHeight = Convert.ToInt32(resolution.Height); dm.dmPelsWidth = Convert.ToInt32(resolution.Width); + + // Some display drivers expose a fixed-output scaling mode for the + // current DSR/DLDSR resolution. That setting belongs to the current + // mode and can make an otherwise valid native resolution fail with + // DISP_CHANGE_BADMODE when it is carried over unchanged. + dm.dmFields |= DM.PelsWidth | DM.PelsHeight; + dm.dmFields &= ~DM.DisplayFixedOutput; + dm.dmDisplayFixedOutput = 0; return dm; }; ChangeDisplaySetting(display.ID, func); @@ -308,6 +316,9 @@ private void ChangeDisplaySetting(uint deviceID, Func func) DISP_CHANGE iRet = NativeMethods.ChangeDisplaySettingsEx( d.DeviceName, ref dm, IntPtr.Zero, DisplaySettingsFlags.CDS_UPDATEREGISTRY, IntPtr.Zero); + + if (iRet != DISP_CHANGE.Successful) + throw new InvalidOperationException($"Unable to change display settings for {d.DeviceName}: {iRet}"); } }