2012-01-09 42 views
3

正常的方式來捕獲窗口的圖像是調用:如何將Direct3D/WPF/DWM窗口捕獲到位圖中?

HDC SharedWndDC = GetWindowDC(SharedWnd); 
BitBlt(BitmapDC, 0, 0, width, height, SharedWndDC, 0, 0, SRCCOPY /* |CAPTUREBLT */); 
ReleaseDC(SharedWnd, SharedWndDC); 

其中運行DWM的系統上,很好地抓住剛有問題的窗口,即使它被其他窗口或部分關閉重疊屏幕,或什麼。

但是,它不適用於某些窗口(大概是那些使用WPF的),並且對玻璃區域做了些有趣的事情。基本上,GDI捕獲不適用於非GDI的東西。

我明白我真正想要的是獲取Direct3D「後臺緩衝區」或「前臺緩衝區」,但我見過的大量示例都是爲了捕獲整個屏幕或桌面。不知道Direct3D,我找不到一個示例或簡單的聲明,說明如何獲取現有窗口的適當對象,然後我可以從中獲取緩衝區。

某種靈魂至少能表現出缺失的一塊嗎?

-John

回答

1

我不相信有一種方法來捕捉前緩衝區的內容不捕捉整個屏幕,背面緩衝區是私有的運行的Direct3D應用程序。只有在顯卡實際向監視器顯示數據時才能看到前緩衝區的內容。藉助GDI,Windows可以訪問前臺和後臺緩衝區,因爲它自己正在管理它們。但與Direct3D(我假設WPF),這不再是這種情況。 Windows無法訪問緩衝區,因此,除非應用程序將其提供給Windows,否則無法獲取數據,這是不可能的(沒有爲此定義的消息)。

編輯:

這看起來像一個死的問題,但我會的情況下,仍要添加這個別人來一起尋找答案。上述問題仍然適用於以編程方式獲取窗口內容。但是,當您想要捕獲的窗口具有鍵盤焦點(也就是活動窗口)時,可以在Windows中使用快捷鍵ALT +打印屏幕來獲取單個窗口的內容。這可能會幫助你,但它確實捕獲了有問題的窗口的內容,即使是使用DirectX的東西。