如何钩取/覆盖DirectX游戏?

13

有人能告诉我如何在C#中挂钩/覆盖DirectX游戏吗?

我尝试让一个全屏的C#窗口重叠在游戏上,但它不起作用。经过一些研究,我发现需要挂钩游戏,然后再显示C#窗口。

有人能解释一下我应该如何做吗? 我能在DirectX游戏上显示一个C#表格吗?


有人能帮忙吗?如果有人看过Steam或xFire的悬浮窗口,我就想要那种。用户可以在玩游戏等过程中浏览网页。 - Joey Morani
3个回答

16
你可以尝试使用C#钩取Direct3D 9 API的示例my example on hooking the Direct3D 9 API using C#。这利用了EasyHook,这是一个开源的.NET程序集,允许你从托管代码中向非托管函数安装钩子。
同时使用了SlimDX - 这是一个开源的Direct3D库的托管包装器。
钩取的棘手之处在于确定COM对象虚拟函数的地址。上面的示例使用一个小的C++辅助DLL来从VTable中找到地址。[更新:有一条评论发布了如何在C#中从com对象获取函数指针的方法 - 给定一个IntPtr]
该示例钩取了IDirect3DDevice9的EndScene方法,这也是您想要绘制任何覆盖层的地方。至于在覆盖层中显示一个窗体,我不确定是否那么容易 - 我的意思是你可以轻松地渲染图像,但你必须捕获输入并手动响应/传递事件到相应的窗体。祝你好运!

1
这是一个更新版本,其中包含一个非常简单的覆盖示例 - 同时也是100% C#:Direct3D 9,10 覆盖 - Justin Stenning
1
链接不幸已经失效。 - smedasn

5

谢谢。我已经申请了。你能解释一下如何使用Deviare API来钩取DirectX游戏并显示一些内容吗?再次感谢。 - Joey Morani
1
你可以在相关的论坛上提问。我的建议是以这些文章作为起点。 - sw.
2
这并不能解决其他人的问题。请描述一下解决方案是什么。 - Mathias Lykkegaard Lorenzen
1
@MathiasLykkegaardLorenzen 在 Deviare 中添加覆盖层和捕获视频的源代码可在以下网址找到:https://github.com/nektra/AVRecorderTool - sw.

2

因为 C# 没有直接访问 DirectX,所以这可能会有些棘手。

根据我的有限理解:

DirectX Hook 包括附加到 DirectX 上下文并操作它,这可能需要干扰其他程序的内存,最适合使用 C/C++。

不过我可能是错的,然而这是一个高级主题,我的直觉告诉我,在 .NET 下可能会遇到问题。


用C++进行钩子,然后从钩子内运行C#程序怎么样?这样做会让C#程序显示出来吗?还是不起作用? - Joey Morani
不,你不能这样在未管理的C++中展示C#程序。一个普遍的建议是使用C++/CLI来创建一个管理/未管理的C++包装器,它既与DirectX半交互,又是C#可以直接调用的“管理”库的一部分。但是看起来有些丑陋。Spazzarrama (Justin S. ^)的钩子和叠加示例完美地工作,并且是一个宝贵的资源。 - Jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接