在Windows 10上,系统不再需要重新启动(注销/登录)来更改DPI(文本大小)。
我的应用程序尚未准备好进行此类运行时更改。
系统如何通知应用程序DPI正在发生变化?我应该处理什么信息?
我正在使用C ++ Builder,所以我正在寻找一个纯WinAPI解决方案,没有WinForms。
答案 0 :(得分:9)
作为@TLama和@DalijaPrasnikar commented,要处理的邮件是WM_DPICHANGED
。
#define WM_DPICHANGED 0x02E0
自Windows 8.1以来,该消息可用,当窗口移动到具有不同DPI的另一台监视器时,该消息将被发送到窗口。
在Windows 10上,从API的角度来看,DPI的运行时更改与将窗口移动到具有不同DPI的不同监视器相同(当然,除非在这种情况下窗口停留在同一监视器上)。 / p>
为了甚至接收消息(即使在Windows 10上进行运行时DPI更改),应用程序也需要声明对每个监视器DPI的支持。首选方法是declare the support in an application manifest将dpiAwareness
设置为PerMonitorV2
(以及其他PerMonitor
值,并将dpiAware
设置为True/PM
,以便与旧版本向后兼容Windows 10版本和Windows 8.1):
<?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运行时更改上按像素方式缩放其窗口。然后由应用程序来本地扩展其窗口。
答案 1 :(得分:1)
自C ++ Builder 10.3起,您可以使用以下表单事件:
当然,您还需要在项目设置的应用程序清单中将DPI Awareness设置为PerMonitorV2。