使用OpenGL和C#截取游戏截图

时间:2011-03-08 18:13:39

标签: c# opengl screenshot

我一直在搜索如何截取使用全屏幕并使用OpenGL的游戏的截图。如果我使用CopyFromScreen或BitBlt,游戏屏幕将不会出现,我只会看到游戏背后的内容。 我已经阅读了一些关于此的教程,但它们涉及DLL挂钩和一些C ++。 有没有办法使用纯粹的C#? (或者用一些调用......)

1 个答案:

答案 0 :(得分:1)

使用屏幕的HDC(将NULL传递给GetDC函数)的BitBlt是你最好的选择,除非你想使用钩子DLL。如果这不起作用,则剩下几个选项。

glReadPixels不会像这样工作。您需要应用程序的GL上下文作为线程中的当前上下文,否则您将获得最佳的黑色图像,以及平均情况下的分段错误。 wglShareLists或wglCopyContext等也不会对您有所帮助,因为您只能在同一进程中共享上下文

这就是DLL挂钩进来的地方。基本上,你创建了一个DLL,它将被放置在程序的文件夹中,该文件夹导出与OpenGL DLL相同的符号,并简单地将它们全部转发到原始文件中(简单地说,嗯!)。
但是,对于SwapBuffers,您可以做更多的事情。您首先将该函数转发到原始函数,然后执行glReadPixels。碰巧的是,当调用该函数时,GL上下文在您的线程中必然是最新的,因此它将起作用。此外,由于SwapBuffers刚刚完成了它的工作,因此可以保证属于前一帧的所有绘制调用都已完成,并且完整的图像现在位于前缓冲区中。