2011-03-08 52 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