OpenGL/DirectX Hook - 与FRAPS类似

Dav*_*vid 12 c# c++ opengl directx winapi

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

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

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

Nec*_*lis 8

也许最简单的方法是检查的OpenGL和DirectX核心库的存在,可能也是一个好主意,在驱动程序中添加OGL的dll太(如nvogl),这可以通过完成EnumProcessesEnumProcessModulesEx,使用P/Invoke,这至少可以为您提供一组可能使用OGL或DX的过程.

当然,某些应用程序加载两个API的,并且只使用一个,或者只是有条件地使用的GFX API的(尽管后者只用专门的工具和等时),为此,国际海事组织,检查最好的办法是进行一个某种形式的注入或附加到过程,如调试器,然后挂钩PresentDX或wglSwapBuffersOGL.

你可能会通过枚举GDI句柄并寻找DXGI或OGL渲染上下文而不使用钩子,这是多么可行,我不知道.


dan*_*itz 6

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

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

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