PrintScreen 内容比我看到的要大

PrintScreen contents are larger than what I see

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

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

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

BitBlt 和 "Graphics" 都 return 我的分辨率是 1536x864 @ 96 DPI。

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

现在截取的图像,就像是从 1920x1080 截取的,但截取了 1536x864 区域作为屏幕截图。

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

我正在寻找的是一种解决方案,可以让我在 scale/dpi/whatever 中拍摄屏幕上的内容,看起来像这样。我已经编写了一个屏幕捕获程序,并为 RubberBand 表单使用了几个不同的示例(通过绘制一个框将表单覆盖到 select 屏幕区域),正如您可以想象的那样,这种缩放垃圾导致了那些box 捕获偏移,内容被缩放。

这很烦人 -- 即使要解释,但我肯定你们中的大多数人都熟悉我使用的术语,并且也知道截图会发生什么,所以我上面的解释应该很清楚至于我的问题是什么。

Example/Consideration

想象一下,拍摄一张 300x300 的 window 的照片,然后将左上角的 150x150 放大到 300x300,完全跳过 window 的其余部分。生成的图像仍然是 300x300,但这不是您 select 编辑的。

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

这正是正在发生的效果。当我尝试捕获屏幕的某个区域或部分时。我不确定为什么 windows api/crl 在这个看似微不足道的事情上撒谎,但是必须有一种方法可以在所有分辨率下准确地获得 screenshots/capture 没有这种人造缩放效果的区域。

感谢 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 更改为清单的任何版本),就在“”

的最后结束行上方

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