挂钩/覆盖 DirectX 游戏?

Posted

技术标签:

【中文标题】挂钩/覆盖 DirectX 游戏?【英文标题】:Hook/Overlay a DirectX game? 【发布时间】:2011-02-08 15:11:28 【问题描述】:

谁能告诉我如何在 C# 中

我尝试让全屏 C# 窗口与游戏重叠,但它不会。 研究了一下,发现需要hook游戏,然后显示C#窗口。

谁能解释一下我会怎么做? 我可以在 DirectX 游戏中显示 C# 表单吗?

【问题讨论】:

有人吗?如果有人看到 Steam 或 xFire 叠加层,我想要这样。用户可以边玩游戏等边上网。 【参考方案1】:

你可以试试my example on hooking the Direct3D 9 API using C#。这利用了 EasyHook 一个开源 .NET 程序集,它允许您将挂钩从托管代码安装到非托管函数中。

还使用了 SlimDX - 这是一个围绕 Direct3D 库的开源托管包装器。

挂钩的棘手部分是确定 COM 对象的虚拟函数的地址。在上面的示例中,这是使用一个小型 C++ 帮助程序 DLL 完成的,该 DLL 从 VTable 中查找地址。 [更新:有一条评论显示如何在 C# 中从 VTable 中获取函数指针 - 给定 com 对象的 IntPtr]

该示例挂钩 IDirect3DDevice9 的 EndScene 方法,这也是您想要绘制任何叠加层的地方。至于在叠加层中显示表单,我不太确定这会这么容易——我的意思是你可以很容易地渲染图像,但你必须捕获输入并手动响应/传递事件到表单适当提问。祝你好运!

【讨论】:

这是一个更新版本,其中包含一个非常简单的 Overlay 示例 - 也是 100% C#:Direct3D 9,10 overlay 链接失效了【参考方案2】:

(披露:我在这家公司工作)

您可以试试我们的Deviare API,它具有从 C# 挂钩 COM 对象的功能。 它是一组可用于任何编程语言(支持 COM)的 COM 对象。提供了一篇包含如何捕获视频和添加覆盖的源代码的文章:instrumenting Direct3D applications to capture video and calculate FPS

COM Spy Console 和Direct Sound Capture 是两个示例,它们实现了一个控制台来挂钩 COM 对象,例如 DirectX。

希望对你有帮助。

【讨论】:

谢谢。我已经申请了。你能解释一下我如何让 Deviare API 来挂钩一个 directx 游戏并显示一些东西吗?再次感谢。 您可以到那里的相关论坛提问。我的建议是以文章为起点。 这并不能解决其他人的问题。请描述解决方案是什么。 @MathiasLykkegaardLorenzen 使用 Deviare 添加叠加层和捕获视频的源代码可在以下位置获得:github.com/nektra/AVRecorderTool【参考方案3】:

由于您没有来自 C# 的直接 DirectX 访问权限,因此这可能很棘手。

根据我对这个概念的有限理解:

DirectX Hooks 包括附加到 DirectX 上下文并对其进行操作,这可能/可能不需要弄乱另一个程序的内存,这是最适合 C/C++ 的东西

虽然我可能错了,但这是一个高级主题,我的直觉告诉我您可能在 .NET 下遇到问题

【讨论】:

如何使用 C++ 进行挂钩,然后从挂钩中运行 C# 程序?这不会让 C# 程序显示出来,或者它不是那样工作的吗? 不,你不能像这样在非托管 C++ 中显示 C# 程序。一个常见的建议是将 C++/CLI 用于托管/非托管 C++ 包装器,该包装器与 DirectX 有一半接口,但也是 C# 可以直接调用的“托管”库的一半。但它看起来很丑。 Spazzarrama (Justin S. ^) 的 hooking 和 overlays 示例非常有效,是非常宝贵的资源。

以上是关于挂钩/覆盖 DirectX 游戏?的主要内容,如果未能解决你的问题,请参考以下文章

DirectX 游戏挂钩

亲爱的 IMGUI 和 DirectX 12 覆盖 (DXGI_ERROR_INVALID_CALL)

我的电脑装了directx 9,但装游戏的时候自动又安装了directx 9 占内存吗 有影响吗 如何将后来的那个卸掉

没有directx12可以玩directx12的游戏么?

连接到 DirectX 应用程序

窗口内的 DirectX 覆盖