gpt4 book ai didi

c# - 使用带有 C# 的 OpenGL 截取游戏的屏幕截图

转载 作者:太空宇宙 更新时间:2023-11-03 14:21:30 30 4
gpt4 key购买 nike

我一直在寻找如何截取使用全屏并使用 OpenGL 的游戏的屏幕截图。如果我使用 CopyFromScreen 或 BitBlt,游戏画面将不会出现,我只会看到游戏背后的内容。我已经阅读了一些关于此的教程,但它们涉及 DLL Hook 和一些 C++。有没有一种方法可以使用纯 C# 来做到这一点? (或者通过一些调用...)

最佳答案

BitBlt 使用屏幕的 HDC(将 NULL 传递给 GetDC 函数)是最好的选择,除非您想使用 Hook DLL。如果这不起作用,您就没有多少选择了。

glReadPixels 不会像这样工作。您需要应用程序的 GL 上下文是您线程中的当前上下文,否则在最好的情况下您会得到一个黑色图像,在一般情况下会出现段错误。 wglShareLists 或 wglCopyContext 等对您也没有帮助,因为您只能在同一进程中共享上下文

这就是 DLL Hook 的用武之地。基本上,您创建一个 DLL 将放置在程序的文件夹中,它导出与 OpenGL DLL 相同的符号,并将它们全部转发到原始文件(简单,呵呵!)。
但是,对于 SwapBuffers,您要做的远不止于此。您将首先将函数转发给原始函数,然后执行 glReadPixels。碰巧的是,当调用该函数时,GL 上下文在您的线程中必然是当前的,因此它会起作用。此外,由于 SwapBuffers 刚刚完成其工作,您可以保证属于前一帧的所有绘制调用都已完成,并且完整的图像现在位于前台缓冲区中。

关于c# - 使用带有 C# 的 OpenGL 截取游戏的屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5236533/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com