最近要做一个windows下截屏识别文字的程序,调试发现截取的图像显示不完整。
输出了Screen.PrimaryScreen.Bounds.Width获取的值,结果与实际分辨率不同,所以确定了与我的系统设置了150%的显示缩放有关系。
网上找答案,各种dpi的计算或是bitmap的处理,折腾我大半个小时还是没找到完美的解决方案。
我决定打把lol放松放松(解决问题不必过急,一头扎进去反而会当局者迷,先放一放也许会突然地灵机一现)
在敌方水晶爆炸的那瞬间,我想起了之前做的WPF程序可以自动支持缩放,winform也应该可以吧。
缩放主要就是form的问题嘛,把form缩放尺寸计算好了,其它控件就可以有依据了。
我没有去用代码计算,先是把与size相关的form属性都改了一遍,看有什么效果,
果不其然找到了原因,结论就是:
AutoSize=True; AutoSizeMode=GrowAndShrink,两个属性完美解决问题。
补更:
MD,我智障了,因为Form上就一个背景图没有控件,所以设置了启用AutoSize后(根据内容自动调整大小)窗体宽度为0看不见了,之前F5运行屏幕截图就会被放大显示不完整,现在看起来就像是屏幕画面缩放正常还以为解决了呢,其实是窗体看不见了。
好在最终还是找到了真实可靠的解决方案……
<application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> </windowsSettings> </application>
给项目添加清单文件,加入上面的代码就可以感知DPI的变化了。