WIN10下系统缩放比例(DPI)的魔幻设置


前言

前几天突然想起了以前做的一个答题器,原理是截取图片以后用OCR识别出题目,然后再过题库。但是一直有个BUG没法解决,就是WIN7/10有系统缩放(DPI),如果DPI不是100%,就会导致截图区域不对,无法识别。

在网上查阅了很多资料,主要都是通过Windows的GetDeviceCaps加上OGPIXELSX参数(或者OGPIXELSY也行)来获得系统DPI的。这个函数查询出来结果需要换算成缩放百分比。

但是自己试了很长时间,发现无论缩放比例设置成什么样子,这个函数查出来的永远都是96(就是没有缩放的时候的结果)。过了几天,又突然发现能正常的查出120了(也就是125%的缩放)。绞尽脑汁想了很久,才想出来是为什么。

第二种获得DPI的方法则是用可视桌面的像素(DESKTOPHORZRES)除以真实像素(HORZRES)来获得比例。这两种方法有什么区别后面会着重说,我们先来讲WIN10的坑爹设置。


WIN10的坑爹设置

在WIN10里有两种设置缩放的方法,一种是在“更改文本、应用等项目的大小”里选择,只有几种预设好的比例可以选择(100%、125%什么的),默认是125%。第二种是在这个选项下面的“高级缩放设置”里填写自定义缩放。

然而这两种方法居然不是相同的!甚至一丁点关系都没有!

你可以脑补有两个系统变量,用第一种设置方式的时候变量A的值会改变,而变量B则变回默认的值(100%);用第二种设置方式的时候变量A会变回默认(96 也就是100%),而变量B则会按照设置的值变化。

这也是为什么之前我测试的那么多次有的时候可以有的时候不可以,因为可以的时候我是用高级模式里的自定义缩放设置的,这样可以查询到正确的DPI,但是用桌面像素除以真实像素的方法不可以!你会发现真实像素居然纹丝不动!然而如果你是用默认方法(更改文本、应用等项目的大小),那么DPI是查询不到的,查询到的永远是96,但是真实像素变了,从1920变成1536了,刚好是125%,程序员都感动哭了。

综上所述

  • 当用户使用默认方法设置缩放时,应该使用GetDeviceCaps(DESKTOPHORZRES)/GetDeviceCaps(HORZRES)获得缩放比例
  • 当用户使用高级模式中的自定义缩放时,应该使用GetDeviceCaps(LOGPIXELSX)再除以0.96(再除以100,因为算出来的数字是百分比)

这两种查询方法还有一种内在逻辑关系,某一种方法能查询出正确的值的时候,另外一种方法的结果一定是100%。因为100%是“默认的值”。

所以:

dpiA = GetDeviceCaps(hDC, DESKTOPHORZRES)/GetDeviceCaps(hDC, HORZRES)
dpiB = GetDeviceCaps(hDC, LOGPIXELSX)/0.96/100
if dpiA == 1:return dpiB
elif dpiB == 1:return dpiA
elif dpiA == dpiB:return dpiA
else:return None

逻辑就是,两种DPI中肯定至少有一个是1(默认值),如果两个都是,那就是1,如果只有一个是1,那另外一个一定是真实值。如果两个都不是并且相等,那可能是其他设置方式,反正值都一样,那说明可信度比较高,直接返回即可。如果都不是1,又不相等,那可能是某种未知的情况,返回None表示数据不对,再进行排查。

折腾了半天,终于把WIN10的迷醉DPI设置搞好了。

WIN10下系统缩放比例(DPI)的魔幻设置相关推荐

  1. linux怎么让cpu不自动降频,Win10 CPU自动降频怎么办?Win10下让CPU不降频设置方法

    有一些用户反馈在Win10系统下CPU会自动降频,也就是自动降低频率以减少资源消耗,如果是平时还没有什么,但是如果你在玩游戏,那么降频给大家带来游戏性能的降低是不能接受的,游戏会变的卡顿下面小编给大家 ...

  2. win10下anaconda+spyder+keras 下载与设置大全(汉化、环境变量设置、DPI缩放等)

    目录 一.anaconda的下载与安装 1.环境变量的设置 二.spyder的设置 1.spyder的汉化 2.设置spyder的布局.DPI缩放与弹出窗口显示图片 三.keras+TensorFlo ...

  3. Win10下系统自带的各种监测工具

    1.先说缘由.使用360后开机速度明显变慢,反正不管怎么说都是360的锅(坦白讲,就是不喜欢360...的流氓): 2.使用自带的杀毒Windows Defender.虽然有点傻但是一下子世界清静了. ...

  4. windows10系统的DPI设置的那些事

    一款win10系统桌面应用程序,基于c++做的一个程序启动外壳,外壳主要作用是启动java虚拟机,调jar包启动程序. 当程序启动时,系统设置不同DPI,java本地拿dpi的值与实际的dpi不符. ...

  5. win10 mbr下装linux,在Win10下安装Ubuntu 18.04双系统(MBR+Legacy)

    刚刚在win10下安装了ubantu18.04系统,亲测有效!中途遇到了很多坑,一一为大家避免 以下就是我安装双系统的详细步骤 BIOS引导方式 目前主要的系统引导方式也有两种:传统的LegacyBI ...

  6. 1、win10下连接本地系统上的Linux操作系统(分别以Nat方式和桥接模式实现)

    1.win10下连接本地系统上的Linux操作系统(分别以Nat方式和桥接模式实现) 一.准备知识:win10下打开Administrator的方式 在win10操作系统中,Administrator ...

  7. linux子系统 重置,浅析win10系统重置Linux子系统的设置方法

    今天小编给大家浅析win10系统重置Linux子系统的设置方法,重置Linux子系统后,我们就可从头配置Linux子系统,例如新建用户.设置密码,并在里面安装我们需要的应用程序等,有需要的用户,请来看 ...

  8. w10系统自带linux系统,win10下,内置linux系统的安装和体验,你造吗?

    原标题:win10下,内置linux系统的安装和体验,你造吗? 众所周知,windows系统和linux系统一直是水火不容,而在最新的win10系统却完美兼容了linux系统,但是在默认情况下是关闭的 ...

  9. win10下安装Ubuntu18.4双系统(适合小白)

    win10下安装Ubuntu18.4双系统(适合小白) 注:本篇为传统MBR引导方式下安装. 查了很多博客,有的地方说法都不同,导致踩了一些坑.所以大家参考的时候还是得对自己的电脑配置等要具体情况具体 ...

最新文章

  1. Scala函数式编程(三) scala集合和函数
  2. 比Segway轻便的机器人溜冰鞋
  3. Docker源码分析(七):Docker Container网络 (上)
  4. Windows下的cmd小技巧
  5. 收集服务器配置资源信息
  6. Erlang消息传递-tut15.erl
  7. 蓝桥杯 ALGO-55 算法训练 矩阵加法
  8. JDBC在Java Web中的应用——分页查询
  9. 【Java 常用类】java.util包(5)Date类的常用方法
  10. CAD绘图教程之CAD中怎么进行消防计算?
  11. 概率论 方差公式_数学提高方差的计算公式是什么
  12. su 无法切换账户(密码正确)一直提示Authentication failure(认证失败)
  13. int数组java,java定义int数组
  14. FFMPEG学习【ffmpeg工具】
  15. Activity子流程——调用子流程
  16. 注册github一直显示验证码错误的问题
  17. Python数据分析之用户留存
  18. ERROR:error opening DLL Library错误的一个原因
  19. [实例分割] SOLO: Segmenting Objects by Locations 论文阅读
  20. IPC通信-------初学者入门

热门文章

  1. 与繁重的工作一起修行
  2. 小姜的Android之路
  3. jmeter-BeanShell预处理器与BeanShell后置处理器的使用
  4. python zxing 识别条码_Python zxing 库解析(条形码二维码识别)
  5. 专访溢唐数据:拒掉70%想链改的客户,订单依然排到明年6月
  6. 2022年TikTok的9个变现模式
  7. pytorch Load部分weights
  8. Censored! :ac自动机 + DP
  9. linux网络音频播放,通过 PulseAudio 实现局域网音乐播放
  10. 词向量与词向量拼接_nlp中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert