【发布时间】:2026-01-15 18:35:01
【问题描述】:
我很乐意提供此截图,但问题是捕获的图像比我的实际桌面大得多。
我对此感到非常沮丧,因为我尝试将 BitBlt 与桌面 hdc 和新的“图形”命令一起使用。
我的实际桌面分辨率是 1920x1080 - 1080p。
BitBlt 和“图形”都返回我的分辨率为 1536x864 @ 96 DPI。
一个窗体 (WinForm),最大化、无边界,并且与窗体设置的缩放模式无关,也显示 1536x864 @ 96 DPI。
现在捕获的图像,就像是从 1920x1080 开始,但是将 1536x864 区域裁剪为屏幕截图。
如果我直接使用 Prtscn 按钮执行 PrintScreen,我会得到整个图像,但它仍然比我实际看到的大 1.5-2 倍。
我正在寻找的东西 - 是一种分辨率,用于说明如何以比例/dpi/这里发生的任何事情在视觉上看起来像我的屏幕上的内容。我已经编写了一个屏幕捕获程序,并为 RubberBand 表单使用了几个不同的示例(通过绘制一个框来选择屏幕区域的覆盖表单),正如您可以想象的那样,这种缩放废话导致这些框捕获成为偏移量,内容被缩放。
这很烦人——即使是解释一下,但我很肯定你们中的大多数人都熟悉我使用的术语,并且也知道截屏会发生什么,所以我上面的解释应该很清楚我的问题是什么。
示例/注意事项
想象一下,拍摄一个 300x300 的窗口,然后将左上角的 150x150 放大到 300x300,完全跳过窗口的其余部分。生成的图像仍然是 300x300,但不是您选择的。
现在想象一下,您可以通过编程方式获取的唯一尺寸抓取屏幕图片,然后将图片放入图片框中。即使您的屏幕和图片框都声称具有相同的尺寸和 dpi,图片框中的图像也需要滚动,即使图片框在无边框的无边框/等情况下最大化到全屏 - 再次,图片被缩放,但是它如何仍然报告它与表单 XD 的大小相同(将 Graphics 或 BitBlt 尺寸与实际表单进行比较。还尝试比较图片框内容,效果仍然相同)
这正是正在发生的效果。当我尝试捕捉屏幕的一个区域或片段时。我不确定为什么 windows api/crl 对这些看似微不足道的东西撒谎,但是必须有一种方法可以在没有这种虚假缩放效果的情况下准确地获取屏幕截图/捕获区域——在所有分辨率下。
【问题讨论】:
-
您的程序不会告诉操作系统它是 dpiAware 并且知道如何处理以高 DPI 值运行的视频适配器。那种将您的 800x600 窗口变成“视网膜”显示器上的邮票的那种。因此,操作系统会打开其 DPI 虚拟化功能并自动重新缩放您的窗口以保持其可用。并产生您在 96 dpi 的较小屏幕上运行的错觉。是的,当发生这种情况时,创建屏幕截图不会很好地工作。 Edit the manifest 你的程序。
-
不确定你要做什么来让它知道 dpi,通常 manifest 不会做任何比你可以在属性中设置的更多的事情——不是吗? .你能提供一个可行的例子吗?
-
不,您不能使用属性使您的应用程序 dpiAware。需要编辑清单,您有一个帖子链接,该链接向您展示如何执行此操作。我建议你试试看。
-
尊敬的,该链接指向一堵文字墙,没有清单示例,也没有提及 dpi。另外,考虑一下,表单本身缩放得很好,从桌面 BitBlt 或 CopyFromScreen 复制的图像是错误的。
-
糟糕,使用this one。
标签: winforms graphics screenshot dpi bitblt