You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:42:38