Windows 11中设置PER_MONITOR_AWARE_V2后窗口仍被缩放的原因
问题分析与解决方案
原因
Windows 11对Per-Monitor DPI Aware V2模式下的窗口行为做了兼容性调整:即使你在WM_DPICHANGED消息处理中直接返回、不调用DefWindowProc(),系统仍会自动按照新DPI比例缩放窗口尺寸。这是Win11新增的强制自动缩放逻辑,目的是减少高DPI场景下应用的显示异常,但和Win10的旧逻辑不一致。
你的测试中GetWindowRect()返回的尺寸和WM_DPICHANGED的LPARAM建议值一致,正是这个系统自动缩放的结果。
解决步骤
要维持窗口物理尺寸不变,需要在WM_DPICHANGED消息中手动重置窗口尺寸:
- 提前保存DPI变化前的窗口物理尺寸(比如在窗口创建时或
WM_DPICHANGED触发前,调用GetWindowRect()记录原RECT)。 - 在
WM_DPICHANGED处理逻辑中,调用SetWindowPos()将窗口尺寸强制设置回原物理尺寸,覆盖系统的自动缩放:
// 示例代码片段 RECT originalRect; GetWindowRect(hWnd, &originalRect); case WM_DPICHANGED: // 重置窗口到原物理尺寸 SetWindowPos(hWnd, NULL, originalRect.left, originalRect.top, originalRect.right - originalRect.left, originalRect.bottom - originalRect.top, SWP_NOZORDER | SWP_NOACTIVATE); return 0;
- 额外确认:在
WinMain()中调用SetProcessDPIAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)后,最好在窗口创建时再调用SetWindowDpiAwarenessContext(hWnd, DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2),确保窗口级别的DPI感知设置生效。
内容的提问来源于stack exchange,提问作者Nick Kovac
相关产品推荐
相关产品推荐

