第三种方法:使用Windows 8.1以上版本的DPI虚拟化锁定机制
在Windows 8.1以上版本中,新增了SetProcessDpiAwareness(int level)函数作为DPI支持级别的设置函数。这个函数有三个级别:0表示不支持DPI缩放,1表示支持系统级DPI缩放,2表示支持逐显示器DPI缩放。
每个进程只能设置一次DPI级别,一旦设定了级别,其它任何改变级别的尝试都会失败(包括老的SetProcessDPIAware函数)。
在manifest资源中,可以设置<dpiAware>选项来设置DPI缩放级别,设置为false相当于调用SetProcessDpiAwareness(0),设置为true相当于调用SetProcessDpiAwareness(1),设置为true/pm或per monitor相当于调用SetProcessDpiAwareness(2)。
通过
在manifest资源中设置<dpiAware>为false,可以让PE Loader在程序启动时调用SetProcessDpiAwareness(0),也就声明了程序不支持DPI缩放,同时屏蔽了任何后续函数调用,也就强制开启了DPI虚拟化。
此方法对Windows 7无效,因为Windows 7中不存在SetProcessDpiAwareness函数,设置<dpiAware>为true相当于调用SetProcessDPIAware,而设置为false相当于什么都没做,当然不可能锁定DPI级别了。
具体方法请见此帖:
【技术】彻底解决WinForms在高DPI下的设计问题