OpenGL / DirectX Hook – 与FRAPS类似

是否可以检测使用OpenGL或DirectX的应用程序与FRAPS的作用类似? (可能使用某种forms的钩子)? 我可能不需要实际绘制到窗口,我只需要知道什么过程正在进行某种forms的3D渲染。

(编辑:)如果您不熟悉它,FRAPS是一个程序,可用于在3D应用程序上绘制“每秒帧数”计数器。 FRAPS自己查找所有正在运行的3D应用程序,而无需您指定进程名称。

绘制到外部游戏的“每秒帧数”计数器的示例: 在此处输入图像描述

可能最简单的方法是检查OpenGL和DirectX核心库的存在,也可能是添加到驱动程序OGL dll中的好主意(例如nvogl),这可以通过EnumProcessesEnumProcessModulesEx来完成,使用p /调用,这至少会为您提供一组可能使用OGL或DX的启动流程。

当然,有些应用程序加载了两个API,只使用一个,或者只是有条件地使用GFX API之一(尽管后者只发生在专门的工具之类),为此,IMO,检查的最佳方法是执行某种forms的注入或附加到进程就像调试器一样,然后挂起Present for DX或wglSwapBuffers for OGL。

您可能即将通过枚举GDI句柄并查找DXGI或OGL渲染上下文来避免使用钩子,这是多么可行,我不知道。

根据我的理解,FRAPS使用相对powershell的方法来确定在哪里铺设商店。 该过程从SetWindowsHookEx开始,请求操作系统将FRAPS挂钩DLL加载到它可以[和未来进程]的每个正在运行的进程中。 DLL中的神奇之处在于使用GetModuleHandleA运行一组程序测试,以观察它所连接的进程是否已加载任何OpenGL / DirectX模块。 如果所有调用都返回NULL,则钩子会尝试从进程中删除自己。

另一方面,如果进程已加载它们,它只需通过删除保护并注入JMP挂钩来挂钩该库中的相应呈现函数。 wglSwapBuffers通常是OpenGL中唯一相关的。 当进程调用此函数时,它最终调用FRAPS模块,然后FRAPS将后端缓冲区捕获到其队列中,以便编码为AVI并呈现其少量指示。 然后它处理wglSwapBuffers的原始请求并将执行返回给程序。

至于在C#中查询…查看EasyHook(http://easyhook.codeplex.com/)并查看它是否对您不起作用。 我个人没有使用此API的经验。

您应该看看如何在Windows游戏上叠加图形? 和链接的文章http://www.ring3circus.com/gameprogramming/case-study-fraps/ 。

第二个链接有一些概念代码,应该执行实际的钩子部分。 它还详细介绍了我如何以及为什么要复制并粘贴到这个答案中。