有谁能告诉我如何在C#中挂钩/覆盖DirectX游戏?
我尝试使用全屏C#窗口来重叠游戏,但它不会。 经过一番研究,我发现我需要挂钩游戏,然后显示C#窗口。
任何人都可以解释我会怎么做? 我可以在DirectX游戏上显示C#表单吗?
答案 0 :(得分:16)
您可以尝试my example on hooking the Direct3D 9 API using C#。这利用EasyHook开源.NET程序集,允许您将托管代码中的挂钩安装到非托管函数中。
还使用了SlimDX - 这是一个围绕Direct3D库的开源托管包装。
挂钩的棘手部分是确定COM对象的虚函数的地址。这是在上面的示例中使用一个小型C ++帮助程序DLL完成的,该DLL从VTable中查找地址。 [更新:有一条评论显示如何从C#中获取VTable的函数指针 - 给一个IntPtr到com对象]
该示例挂钩了IDirect3DDevice9的EndScene方法,这也是您想要绘制任何叠加层的地方。至于在叠加中显示一个表单,我不太确定会如此简单 - 我的意思是你可以很容易地渲染图像,但你必须捕获输入并手动响应/传递事件到表单中问题恰当。祝你好运!
答案 1 :(得分:5)
(披露:我为这家公司工作)
您可以尝试我们的Deviare API,它具有从C#挂钩COM对象的功能。 它是一组可以从任何编程语言(支持COM)使用的COM对象。我们提供了一篇文章,其中包含如何捕获视频和添加叠加层的源代码:instrumenting Direct3D applications to capture video and calculate FPS
COM Spy Console和Direct Sound Capture是两个实现控制台来挂钩COM对象的例子。
希望它有所帮助。
答案 2 :(得分:2)
由于您没有从C#直接使用DirectX,这可能很棘手。
从我对这个概念的有限理解:
DirectX Hooks包含附加到DirectX上下文并对其进行操作,这可能/可能不需要弄乱另一个程序的内存,这是最适合C / C ++的内容
我可能错了,但这是一个高级主题,我的直觉告诉我你可能在.NET下有问题