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

如何阻止控件在接收WM_DPICHANGED_BEFORE/AFTERPARENT时自动缩放?

解决DPI变更时控件自动缩放的问题

针对你遇到的情况,这里有几个可行的解决方向:

  • 修正Manifest配置,明确禁用系统自动缩放
    你当前的Manifest里虽然声明了PerMonitorV2,但可以补充设置禁用系统自动缩放兜底,确保系统不会替你处理窗口内容的缩放:

    <asmv3:application>
        <asmv3:windowsSettings>
          <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware>
          <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
          <disableDpiAwarenessScaling xmlns="http://schemas.microsoft.com/SMI/2020/WindowsSettings">true</disableDpiAwarenessScaling>
        </asmv3:windowsSettings>
    </asmv3:application>
    
  • 在代码中主动设置窗口的DPI感知上下文
    不要依赖文件属性修改(这会覆盖Manifest设置导致DPI消息丢失),而是在窗口初始化阶段调用SetWindowDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2),明确告知系统该窗口需要自行处理DPI变更,不接受自动缩放。

  • 拦截WM_DPICHANGED消息,手动控制窗口尺寸
    收到WM_DPICHANGED消息时,跳过系统默认的自动缩放逻辑,手动保持窗口的原始像素尺寸,仅调整窗口位置(如果需要)。示例伪代码:

    case WM_DPICHANGED:
        // 忽略系统建议的缩放后矩形,保持原窗口尺寸
        RECT* suggestedRect = (RECT*)lParam;
        SetWindowPos(hWnd, NULL, suggestedRect->left, suggestedRect->top, 
                     GetWindowWidth(hWnd), GetWindowHeight(hWnd), 
                     SWP_NOZORDER | SWP_NOACTIVATE);
        return 0;
    
  • 禁用标准控件的自动DPI缩放
    对于系统标准控件(如按钮、编辑框),默认会跟随DPI自动缩放。可以通过子类化控件,拦截WM_DPICHANGED消息并直接返回0,或者在创建控件时设置特定扩展样式(部分控件支持),阻止其自动缩放行为。

  • 自定义处理位图与字体的显示
    加载位图时直接使用原始像素尺寸,不通过DPI缩放因子计算;创建字体时指定固定像素大小(比如CreateFont(12, 0, ...)),确保在任何DPI环境下都保持一致的显示比例。

内容的提问来源于stack exchange,提问作者Ckdgml Dl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:45:56