2009-05-06 64 views
6

我跟着這個tutorial的窗口下(還有比怎麼在這裏列出來,因爲在我的代碼,我得到通過鼠標點擊窗口多一點)爲抓住一個窗口,一個位圖,然後呈現該位圖的不同的窗口。捕捉隱藏或最小化

我的問題:

當最小化或隱藏的窗口(SW_HIDE)我的屏幕捕獲不能正常工作,所以是有可能當它最小化或隱藏捕捉窗口?

回答

5

PrintWindow API工作得很好,我用它捕捉縮略圖隱藏窗口。儘管名稱與WM_PRINT和WM_PRINTCLIENT不同,但它幾乎適用於除Direct X/WPF窗口之外的所有窗口。

我添加了一些代碼(C#),但在回顧了代碼的使用方式之後,我意識到當我捕獲它的位圖時,窗口實際上並沒有隱藏,因此它可能不適用於您的情況。你能否將窗口顯示出屏幕,進行打印,然後再將其隱藏起來?

 public static Bitmap PrintWindow(IntPtr hwnd) 
    { 
     RECT rc; 
     WinUserApi.GetWindowRect(hwnd, out rc); 

     Bitmap bmp = new Bitmap(rc.Width, rc.Height, PixelFormat.Format32bppArgb); 
     Graphics gfxBmp = Graphics.FromImage(bmp); 
     IntPtr hdcBitmap = gfxBmp.GetHdc(); 
     bool succeeded = WinUserApi.PrintWindow(hwnd, hdcBitmap, 0); 
     gfxBmp.ReleaseHdc(hdcBitmap); 
     if (!succeeded) 
     { 
      gfxBmp.FillRectangle(new SolidBrush(Color.Gray), new Rectangle(Point.Empty, bmp.Size)); 
     } 
     IntPtr hRgn = WinGdiApi.CreateRectRgn(0, 0, 0, 0); 
     WinUserApi.GetWindowRgn(hwnd, hRgn); 
     Region region = Region.FromHrgn(hRgn); 
     if (!region.IsEmpty(gfxBmp)) 
     { 
      gfxBmp.ExcludeClip(region); 
      gfxBmp.Clear(Color.Transparent); 
     } 
     gfxBmp.Dispose(); 
     return bmp; 
    } 
+0

有趣,我想,但我沒有得到結果。你可以發佈一些代碼或鏈接或其他? 感謝 – cbrulak 2009-05-07 21:13:40

1

WM_PRINTWM_PRINTCLIENT消息,你可以發送到窗口,這導致其內容被渲染到您選擇的HDC

然而,這些都不是完美的:而標準的Win32控件正確處理這些,在應用程序的自定義控件可能不會。

0

我想獲取部分隱藏的控件的位圖。

我使用的代碼之前做的圖,但包括窗口重疊它。所以..也許你想試試這個。 WM_PRINTCLIENT應該(在我的理解中)重新繪製控件內部,即使它不是真正可見的。

const int WM_PRINT = 0x317, WM_PRINTCLIENT = 0x318, PRF_CLIENT = 4, 
PRF_CHILDREN = 0x10, PRF_NON_CLIENT = 2, 
COMBINED_PRINTFLAGS = PRF_CLIENT | PRF_CHILDREN | PRF_NON_CLIENT; 
SendMessage(handle, WM_PRINTCLIENT, (int)hdc, COMBINED_PRINTFLAGS); 
//GDIStuff.BitBlt(hdc, 0, 0, width, height, hdcControl, 0, 0, (int)GDIStuff.TernaryRasterOperations.SRCCOPY); 

代碼之前,現在註釋掉。它基於這裏找到的代碼:Pocket PC: Draw control to bitmap(接受的答案)。這與蒂姆羅賓遜在本主題中提出的建議基本相同。

而且,這裏看看 http://www.tcx.be/blog/2004/paint-control-onto-graphics/

相關問題