2010-01-27 112 views
3

我有一個帶兒童的主窗口。我需要以編程方式截取屏幕截圖,然後在我的主窗口上裁剪並繪製它們。我這樣做的方式是:獲取運行OpenGL的子窗口的屏幕截圖(Windows)

HDC hDC = GetWindowDC(hWnd); 
HDC memDC = CreateCompatibleDC(hDC); 
HBITMAP memBM = CreateCompatibleBitmap(hDC, Width, Height); 
HBITMAP OldBM = (HBITMAP)::SelectObject(memDC, memBM); 
BitBlt(memDC, 0, 0, Width, Height , hDC, BEGINX, BEGINY, SRCCOPY); 
int Bpp = GetDeviceCaps(hDC,BITSPIXEL); 
int size = Bpp/8 * (Width * Height); 
BYTE *lpBits = new BYTE[size]; 
GetBitmapBits(memBM, size, lpBits); 

但這並沒有捕捉到子窗口的OpenGL的部分,而不是它只是繪製空白在OGL渲染被認爲是該地區。

回答

0

我記得幾年前有類似的問題,當時我試圖屏幕抓取一個視頻,只是得到一個黑色的地區,視頻已經。通過減少視頻驅動程序上的硬件加速設置(在XP上:右鍵單擊桌面>屬性>設置>高級>故障排除),可以解決此問題。

至於基於代碼的解決方案,您可能要參考以下以前的帖子:

Blank Screenshots In Vista and Win7 when gaming

Saving a screenshot of a window using C#, WPF, and DWM

+0

顯然,如果源窗口是子項目,則無法使用DWM縮略圖來實現。我煩了。 – 2010-01-27 18:46:54

0

可能NQR,但你可以渲染場景到一個位圖和把它放進空白空間。

+0

我不知道,但我無法控制孩子的應用程序,所以我不能嘗試它。你應該能夠渲染到一個位圖,我沒有看到任何問題。但正如我所說的OGL窗口只是一些應用程序。 – 2010-01-27 01:57:08

0

我假設你在贏得平臺。

即使您沒有子窗口的源代碼,我也可以渲染位圖。

  1. 首先獲得正確的手柄的子窗口
    • 正確處理搜索是非常棘手的,因爲幾乎所有的勝利是一個窗口(所以有上百個處理...)
  2. 創建位圖
  3. 將截圖窗口的渲染/設備上下文更改爲您的位圖。
    • 並非所有的窗戶都可以做到這一點!
  4. 力重繪
    • 最小化/恢復雙贏什麼
  5. 存儲新的位圖
  6. 恢復渲染你screenshoted窗口/設備上下文。

當心這不是很穩定的過程(OpenGL的可以讓衝突中的上下文句柄變化),並在某些情況下,你甚至不能改變把手到上下文

更安全的是桌面截圖它的自我。

TCanvas *scr=new TCanvas(); 
scr->Handle=GetDC(GetDesktopWindow()); 
// copy scr to your bitmap (do not forget to resize bitmap) 

警告沒有獲得/創建/釋放上下文或勝利往往處理,因爲它是一個小馬車(有時WINAPI功能停止返回正確的處理程序的值)更好的方式是獲得手柄一次,希望沒有人關閉窗口。 ..爲你的孩子贏得你知道什麼時候獲得新的處理程序)IsWindow()函數也是如此。

欲瞭解更多信息看一看:

0

的OpenGL可能會被渲染成一個分層的背景下;嘗試

BitBlt(memDC, 0, 0, Width, Height , hDC, BEGINX, BEGINY, SRCCOPY | CAPTUREBLT); 

改爲。