如何阻止控件在接收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
相关产品推荐
相关产品推荐

