“1)为了在那个窗口上绘制图形,我需要从进程内存中获取一个预先存在的上下文,某种绘图场景的句柄吗?”
是的,你需要确保你的钩子捕捉到重要的上下文创建函数。例如,您对 d3d 中 CreateDevice 的所有变体都很感兴趣。
您没有提及您使用的是哪个 DirectX,但版本之间存在一些差异。例如,在 DirectX 9 中,您最感兴趣的函数是: 1. 创建/返回 IDirect3DSwapChain9 对象 2. 创建/返回 IDirect3DDevice9,IDirect3DDevice9Ex 对象
在较新版本的 DirectX 中,它们的代码被分成(大部分)Device、DeviceContext 和 DXGI。如果您正在执行“特定任务”,请分享您正在处理的 Directx 版本。
除了捕获所有需要的对象以允许您自己的渲染之外,您还希望捕获所有演示事件(GL 中的“SwapBuffers”,DX 中的“Present”),因为那是您想要添加叠加层的时间。
由于您似乎试图在 DX 应用程序之上渲染覆盖,请允许我警告您,制作一个真正通用的解决方案(适用于所有游戏)并不容易。主要是因为需要支持不同的 DX 版本以及多种创建方式 如果您专注于特定的游戏/应用程序,自然会容易得多。
“2.如果应用程序使用DirectX,我可以在上面使用OpenGL图形吗?”
嗯,首先是的。这是可能的。您要搜索的术语是 OpenGL DirectX 互操作性(或简称互操作)
这是一个示例:
https ://sites.google.com/site/snippetsanddribbits/OpenglDxInterop
我不知道他们使用的扩展是否仅在 nVidia 设备中可用 - 检查它。
另一件事是你需要一个非常好的动机才能做到这一点,通常我会简单地坚持使用 DX 进行挂钩和渲染。我认为不同 DX 版本之间的内部互操作是更好的选择。我个人可能会为您自己的渲染代码使用 DirectX9。当然,如果您只需要支持单个 DirectX 版本,则不需要互操作。
奖励:如果您需要生成 C++ 类的完整包装器、快速的脏 dll 包装器,或者只是一般的全局函数挂钩,请随意使用我创建的这个库:
http ://code.google.com/p /hookit/
它远不是一个经过全面测试的工具,只是我 2 天破解的东西,但我发现它非常有用。
请注意,在您的情况下,我建议仅使用 VTable 挂钩,您可能必须将函数偏移量硬编码到表中,但这不太可能改变。
祝你好运 :)