共计 1094 个字符,预计需要花费 3 分钟才能阅读完成。
写代码时候有时需要临时参考代码或者结构体 / 类的定义,但是有没有第二块屏幕,这个时候截图并悬浮就很 Nice。这个功能的实现不复杂,也有很多相关项目。比如 QQ 截图就自带这个功能,什么?为什么不用 QQ 截图?因为单位不让装 QQ。
遂,我在 Github 上找到了这个项目FloatImages
,它是最简洁的,没有其他我不需要的功能,但是它有个问题,就是如果 Windows 随访设置不是 100%,那么他就会出现截图缩放,鼠标位置不正确的情况。
比如我的桌面分辨率是 1920*1080,此时我把鼠标放在右下角,它获取的鼠标位置应该是 x = 192, y = 1080。但事实是 x =1535 y = 863。
我的 Windows 缩放是 125%,将这两个数×1.25 差不多就是桌面分辨率了,因此可以判断是 Windows 缩放在搞鬼。
另外他还会导致截图错位和缩放:
可以看到截的图中的文字不清晰,截图位置也不对,我的截图框框选的是 FloatImage 窗口,它却往左上平移了。
方案一 获取 Windows 缩放系数进行坐标转换
这个解决方法很直接,我们如果能获取 Windows 的缩放系数,比如 125%,那我们把鼠标位置坐标就可以做一个变换,这样就可以了。我尝试搜索或者问 ChatGPT,得到的答案都不能正确获得缩放系数,至少在我的设备上如此。那么这就不列出了,如果方案二也不行的话,可以自行搜索关键词。
方案二 设置 DPI 感知
这个方法只对 Windows 应用有效,我们只需要打开 dpi 感知即可。
Step 1
在项目中新建一个应用程序清单文件:
或者 自行添加 app.manifest 文件并把它添加到你的项目中。点击项目 - {你的项目名}属性
在清单中指定你的清单文件。
Step 2
添加如下代码或者取消注释。
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
如果要查看更多信息,请参阅此处。
添加后再查看效果,发现以上提到的 BUG 都解决了。