2010-02-02 42 views
3

好的,这是我正在尝试做的事情。首先,我将解释我试图达到的最终结果,以防有关于如何做到这一点的其他想法。C#:需要在“假想”桌面上呈现窗体/控件

我正在制作一个屏幕截图实用程序,它只需要一个窗口的屏幕截图...我的窗口(我已完全编程控制)。但是,此窗口可能比该实用程序将运行的计算机的桌面大得多。具有1024x768分辨率的计算机上的高度尤其可能达到几千像素。

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

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

本质上,我需要在一个只存在于代码和内存中的虚构屏幕上绘制控件,我甚至不知道要搜索什么,所以即使想要将什么投入Google(TRUE搜索引擎)很有帮助。

任何想法?提前致谢!

编辑:我正在使用WinForms。

回答

1

您没有提及您的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。它演示了如何打印UserControl,但您应该能够根据自己的目的调整实现。

+0

再次检查出来,它的工作原理! :)谢谢一堆! – Teekin 2010-03-02 21:16:47

1

嗯,这很奇怪。你真的写了这个表单吗? Form类是极其坚持它的Size不能大于屏幕。我从来没有找到解决方法,并从未见过一个发布在WF相关论坛。

Anyhoo,因为没有足够的屏幕,您无法制作屏幕截图。唯一的其他选项是Control.DrawToBitmap()。

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

+0

64位操作系统要求很好。这是针对服务器的。 :)我试图用Control.DrawToBitmap()搞乱无用。它根本不绘制任何东西,虽然LBushkin指出的文章是由一个显然有效的人编写的。我已经复制了他的确切步骤,但我只是得到一张黑色的照片。谢谢你的评论。 – Teekin 2010-02-02 19:24:13

+0

发布您的代码。 – 2010-02-02 19:36:14