DPI 缩放——我的截图怎么只截到了一半
问题
加上截图功能之后,我向机器人发"截图"指令,返回的图片只截到了屏幕的左上部分——右下角大块黑色。我觉得奇怪,检查了代码,PowerShell 脚本写的确实是"截取完整屏幕"。既然指令对的,为什么结果不对?于是我去查脚本拿到的屏幕尺寸——1706×960。我显示设置里明明写的 2560×1440。
排查
之后我查了 Windows 文档才搞明白——程序没有声明 DPI 感知的时候,Windows 会按缩放比例返回一个虚拟分辨率。我的屏幕缩放 150%,所以真实 2560×1440 被除以 1.5,变成了 1706×960。程序拿到这个数去建画布,自然只覆盖了左上那一块。
修复
解决办法是在脚本最前面调用 SetProcessDPIAware()。这个 API 来自 Windows 的 user32.dll,作用是告诉系统——"我这个程序知道 DPI 是啥,别帮我缩放"。加了这一行之后,脚本拿到的屏幕尺寸变回了正确的 2560×1440,截出来的图终于完整了。
收尾
我之后在网上查了一下,发现这个问题好像还挺常见的。现在高分辨屏幕越来越多,但是很多老程序还不知道 DPI 的存在。Windows 为了兼容性,就会默认做缩放。平时可能还没啥事,但是当我写截图脚本的时候,这就是个大问题了。也是相当于学习到了一个冷知识。
← 回到首页