PrintScreen内容比我看到的要大



我很乐意提供一张截图,但问题是捕获的图像比我的实际桌面大得多。

我对此感到非常沮丧,因为我已经尝试将BitBlt与桌面hdc和新的"图形"命令一起使用。

我的实际桌面分辨率是1920x1080-1080p。

BitBlt和"Graphics"都返回我的分辨率为1536x864@96 DPI。

窗体(WinForm),最大化,无边界,与窗体设置的缩放模式无关,也显示1536x864@96 DPI。

现在拍摄的图像就像是从1920x1080开始拍摄的,但将区域1536x864裁剪为屏幕截图。

如果我直接使用Prtscn按钮打印屏幕,我会得到整个图像,但它仍然比我实际看到的大1.5-2倍。

我想要的是一种分辨率,它可以让我以dpi/这里发生的任何事情的比例拍摄屏幕上的图片。我已经编写了一个屏幕捕捉程序,并使用了一些不同的RubberBand表单示例(通过绘制框来选择屏幕区域的覆盖表单),正如你所能想象的,这种缩放垃圾导致这些框捕捉被偏移,内容被缩放。

这很烦人——甚至可以解释,但我确信你们大多数人都熟悉我使用的术语,也知道截图会带来什么,所以我上面的解释应该很清楚我的问题是什么。

示例/考虑

想象一下,拍摄一个300x300的窗口的照片,并将其左上角的150x150放大到300x300,完全跳过窗口的其余部分。生成的图像仍然是300x300,但不是您所选择的。

现在想象一下,你通过编程获得的唯一尺寸抓取屏幕的图片,然后将图片放入图片框中。即使你的屏幕和图片框都声称尺寸和dpi相同,图片框中的图像也需要滚动,即使图片框在无边框的无边框上被最大化为全屏,但是它如何仍然报告它与表单XD的大小相同(将Graphics或BitBlt维度与实际表单进行比较。也尝试比较picturebox内容,但效果仍然相同)

这,正是正在发生的效果。当我试图捕捉屏幕的某个区域或片段时。我不知道为什么windows api/crl在这些看似琐碎的事情上撒谎,但必须有一种方法可以在没有这种虚假缩放效果的情况下准确地获得屏幕截图/捕捉区域——在所有分辨率下。

感谢Hans Passant为我指明了正确的方向。

要为winforms应用程序添加"真正"的dpi缩放支持,可以通过在清单中添加以下块来实现:

项目>添加新项目>Visual C#项目>应用程序清单文件

添加了一个文件,打开它,查找类似的行

</asmv1:assembly>

无论"asmv"数字是什么(在上面的例子中是1),都可以使用它来格式化代码:

<asmv1:application>
<asmv1:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv1:windowsSettings>
</asmv1:application>

粘贴上面的代码(将asmv1更改为清单的任何版本),就在"的最后一行的上方

此外,请确保表单设置为"自动缩放到dpi"(以及所有子元素)。

相关内容

  • 没有找到相关文章

最新更新