在Windows 10上处理DPI(文本大小)的运行时更改

问题描述 投票:9回答:1

在Windows 10上,系统不再需要重新启动(注销/登录)来更改DPI(文本大小)。

我的应用程序尚未准备好进行此类运行时更改。

系统如何通知应用程序DPI正在发生变化?我应该处理什么消息?


我正在使用C ++ Builder,所以我正在寻找一个纯WinAPI解决方案,没有WinForms。

delphi winapi c++builder dpi windows-10
1个回答
9
投票

作为@TLama和@DalijaPrasnikar commented,要处理的消息是WM_DPICHANGED

#define WM_DPICHANGED       0x02E0

该消息从Windows 8.1开始可用,当窗口移动到具有不同DPI的另一个监视器时,它将被发送到窗口。

在Windows 10上,从API的角度来看,DPI的运行时更改与将窗口移动到具有不同DPI的不同监视器相同(当然,在这种情况下,窗口保持在同一监视器上)。

为了甚至接收消息(即使在Windows 10上进行运行时DPI更改),应用程序也需要声明对每个监视器DPI的支持。首选方法是通过将declare the support in an application manifest设置为dpiAwareness(以及额外的PerMonitorV2值并将PerMonitor设置为dpiAware以向后兼容旧版Windows 10版本和Windows 8.1)来True/PM

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    ...
    <asmv3:application>
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
            <dpiAware>True/PM</dpiAware>
            <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2,PerMonitor</dpiAwareness>
        </asmv3:windowsSettings>
    </asmv3:application>
</assembly>

当应用程序声明每个监视器DPI支持时,系统将不会在DPI运行时更改时按像素方式缩放其窗口。然后由应用程序来本地扩展其窗口。

© www.soinside.com 2019 - 2024. All rights reserved.