代码之家  ›  专栏  ›  技术社区  ›  Teekin

C:需要在“虚拟”桌面上呈现窗体/控件

  •  3
  • Teekin  · 技术社区  · 15 年前

    好吧,这就是我要做的。首先,我将解释我试图达到的最终结果,以防有其他想法如何做到这一点。

    我正在制作一个屏幕捕捉实用程序,只拍摄一个窗口的屏幕快照…我的窗口(我有完全的程序控制)。但是,此窗口可能比运行实用程序的计算机的桌面大得多。尤其是在分辨率为1024x768的计算机上,高度可能达到几千像素。

    所以我试图捕捉整个窗口,即使它比屏幕大得多。这就是我想要达到的最终结果。

    一种假设的解决方案是在某种图形或屏幕对象上呈现窗体/控件,并从该对象上截取屏幕快照,而不是从物理桌面上截取屏幕快照。

    从本质上说,我需要在一个虚构的屏幕上绘制控件,这个屏幕只存在于代码和内存中,我甚至不知道要搜索什么,所以即使是把什么放到google(真正的搜索引擎)上的想法也会有帮助。

    有什么想法吗?提前谢谢!

    编辑:我正在使用winforms。

    2 回复  |  直到 15 年前
        1
  •  1
  •   LBushkin    15 年前

    你没有提到你的C应用程序使用哪种技术,我假设它是Winforms或WPF。

    如果您的实现使用wpf,您可以简单地将其呈现为 DrawingImage 使用正确的尺寸-甚至使用wpf的打印功能将窗口内容“打印”到内存中的图像。 Here's a decent example of printing in WPF 你可能会适应(如果你使用wpf)。

    对于winforms应用程序,这有点棘手,因为winform控件在更高的分辨率下不总是很好地伸缩,并且可能会出现对齐问题。 Here's a link that describes printing a WinForm screen to an image . 它演示了如何打印用户控件,但您应该能够根据自己的目的调整实现。

        2
  •  1
  •   Hans Passant    15 年前

    嗯,真奇怪。你真的写了这张表格吗?表单类是 极其 坚持认为它的尺寸永远不会比屏幕大。我从未找到解决办法,也从未在WF相关论坛上看到过。

    不管怎样,你不能拍一个屏幕,因为你没有足够的屏幕。唯一的另一个选项是control.drawtobitmap()。

    当您试图创建位图时,“几千像素”可能会在32位操作系统上遇到OutOfMemory异常的问题。不是因为你没有足够的内存,而是因为虚拟内存地址空间中没有一个足够大的空洞来容纳位图,所以唯一好的解决方法是64位操作系统。