目前,我能够连接到Direct3D应用程序并在其表面上绘制自定义内容。但是,我想暂停此应用程序,然后绘制其他内容。
这甚至可以远程实现吗?就像在该应用程序之上创建另一个我自己的Direct3D窗口一样?
我的目标只是Windows 7,但我想要使用的应用程序仅使用DirectX 9.
问题在于我对DirectX的总体经验很少。
答案 0 :(得分:1)
排序。
你在这里使用两个不同的元素,一个非常大但不是特别复杂:挂钩D3D。另一个(“暂停”应用程序)很简单,但你不太想要你想要的东西。
要通过最简单的方法挂钩D3D,您需要拦截对CreateDirect3D9
的调用并返回您自己的IDirect3D9
,后者会创建并返回您自己的IDirect3DDevice9
。这将使您可以完全控制应用程序的渲染过程。
为了“暂停”它,您需要等待所需的触发器,然后在IDirect3DDevice9::Present
中,调用您自己的事件循环。出于所有意图和目的,这将暂停原始应用程序的代码的执行,但不会暂停进程本身(允许您的代码和事件循环处理)。这将有一些限制,您可能无法使用窗口/ Windows事件(简单地),但它将为您提供完全控制并有效地暂停原始应用程序。
但是,请注意,您必须在每个线程中拦截并重新路由您要“暂停”的执行,它只针对单个线程并且您不希望物理或AI处理时渲染和用户界面暂停。
您需要在循环或IDirect3DDevice9::Present
挂钩期间执行叠加绘图,无论可能是什么,然后根据需要调用实际设备的Present
方法。如果您想要运行多个叠加层,请在从Present
返回之前重复调用真实Present
。根据需要调整。这里的渲染通常很常见(请查看一般的D3D教程),但有一个主要问题:设备的状态未知且可能不兼容,但必须在返回时“未触动”。只需在创建IDirect3DStateBlock9
created from the device后立即缓存即可解决此问题。在Present
挂钩中,创建具有进入状态的另一个状态块,恢复干净状态块,运行代码,然后恢复入口状态块。你可以在没有损坏设备状态的情况下使用任何状态,不会破坏设备的状态(我在实践中使用它,在工作中很棒)。
如果你想要一些相当广泛的例子,我建议你查看the Voodoo Shader project,它有完整的D3D8和9个钩子,包括叠加所需的一切[/无耻的自有项目推广]。随意重用任何概念,或评论进一步的问题;这肯定不是可能对您有用的所有细节。
答案 1 :(得分:-1)
这是一个非常复杂的要完成的事情,因为它非常难以实现。你看到做这类事情的唯一人是steam,teamspeak,xfire,fraps和一些核心开发者。
互联网上有一些工具包显示你必须将DLL注入目标应用程序的内存空间以实现这样的壮举,以及代理DLL等方法。
代理DLL: http://www.codeguru.com/cpp/g-m/directx/directx8/article.php/c11453
注射: http://www.progamercity.net/d3d/372-c-directx9-0-hooking-via-detours.html
祝你好运,这需要一段时间。