2010-02-02 75 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