PrintScreen内容比我看到的要大

时间:2015-04-14 11:21:23

标签: winforms graphics screenshot dpi bitblt

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

我对此感到非常沮丧,因为我尝试将BitBlt与桌面hdc和新的" Graphics"命令。

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

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

一个表单(WinForm),最大化,无边框,与表单设置的缩放模式无关,也显示1536x864 @ 96 DPI。

现在捕获的图像就像从1920x1080开始一样,但是将区域1536x864剪切为截图。

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

我正在寻找的 - 是一个解决方案,我可以如何在尺度/ dpi /屏幕上显示屏幕上显示的内容。我已经编写了一个屏幕截图程序,并使用了几个不同的RubberBand表格示例(通过绘制一个框来选择屏幕区域的叠加形式),你可以想象,这个缩放垃圾导致那些盒子捕获是偏移,内容被缩放。

这非常令人讨厌 - 即使是解释,但我很肯定你们大多数人都熟悉我使用的术语,并且知道截取屏幕截图会有什么期望,所以我上面的解释应该非常清楚我的问题是什么。

实施例/考虑

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

现在想象一下,您可以通过编程方式获取的唯一尺寸来获取屏幕图片,然后将图像放入图片框中。即使您的屏幕和图片框声称尺寸和dpi相同,即使图片框最大化为无边框无边框/全屏,图片框中的图像也需要滚动 - 再次,图片被缩放,但是如何报告它与XD格式的大小相同(将图形或BitBlt维度与实际形式进行比较。还尝试比较图片框内容,但效果仍然相同)

这就是正在发生的影响。当我尝试捕获屏幕的区域或片段时。我不确定为什么windows api / crl会对这些看似微不足道的东西撒谎,但是必须有一种方法可以准确地获取屏幕截图/捕获区域而不会出现这种虚假的缩放效果 - 所有分辨率。

1 个答案:

答案 0 :(得分:0)

谢谢Hans Passant指出我正确的方向。

要为winforms应用程序添加“true”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更改为清单所用的任何版本),就在“”

的最后结束行上方

另外,请确保将表单设置为AutoScale到dpi(以及所有子元素)。