2011-03-08 82 views
2

我一直在搜索如何截取使用全屏幕的遊戲並使用OpenGL。如果我使用CopyFromScreen或BitBlt,則遊戲屏幕不會出現,我只會看到遊戲背後的內容。 我讀過一些關於這個教程,但它們涉及DLL掛鉤和一些C++。 有沒有使用純粹的C#做到這一點的方法? (或者用一些調用...)用C使用OpenGL截取屏幕截圖#

回答

1

除非要使用鉤子DLL,否則使用屏幕的HDC(將NULL傳遞給GetDC函數)的BitBlt是最佳選擇。如果這樣做不起作用,您還剩下幾個選項。

glReadPixels不會像這樣工作。您需要將應用程序的GL上下文作爲線程中的當前上下文,否則您會得到最好的黑色圖像,並且會出現平均情況下的分段錯誤。 wglShareLists或wglCopyContext等也不會幫助您,因爲您只能在相同的過程內共享上下文

這就是DLL掛鉤進來的地方。基本上,你製作一個DLL,它將被放置在程序的文件夾中,該文件夾導出與OpenGL DLL相同的符號,並簡單地將它們全部轉發到原始文件(簡單地說吧! 。
但是,對於SwapBuffers,你會做的更多一點。你會先把這個功能轉到原來的,然後做你的glReadPixels。碰巧,當這個函數被調用時,GL上下文在你的線程中一定是最新的,所以它會起作用。此外,由於SwapBuffers剛剛完成其工作,因此可以保證所有屬於前一幀的繪製調用都已完成,並且完整的圖像現在位於前端緩衝區中。

+0

我試過使用BitBlt函數,但是當遊戲處於全屏模式時,屏幕截圖只顯示桌面和左上角的黑色方塊。如果遊戲處於窗口模式,則它可以正常工作。這裏是我使用的代碼:http://pastebin.com/1k8eVzQc – Ivan 2011-03-09 12:24:15