acmilan作者
10年8个月前修改于 10年8个月前IP:四川
815348
3楼
第三种方法:使用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下的设计问题

Capture3.png

Capture4.png
评论
文号 / 815348

千古风流
名片发私信
学术分 4
总主题 466 帖总回复 2942 楼拥有证书:进士 学者 笔友
注册于 2009/05/30 21:22:42最后登录 2019/01/31 17:16:38
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:0

个人简介

暂未填写
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的