我想做什么:
我有一个基于CrySDK的游戏,它是DirectX11,我想绘制一个像蒸汽覆盖一样的游戏覆盖。
- >我写C#,因为我不知道任何C ++,所以我正在寻找在C#中做到这一点的方法。
- >我使用EasyHook和SharpDX Libaries,因为这似乎是最好的方法。
- >我发现reference project显然是SC2的某种黑客攻击,但我只对叠加部分感兴趣。
- >我使用Visual Studio 2013
- >现在,如果我能在游戏中随机抽取东西,我会很高兴
到目前为止我做了什么:
我正在浏览google和SO搜索结果,问题是,这些内容是在C ++,C还是其他内容,结果是从2010年开始,并不是最新的当前dx11,包含死链接或无法使用任何其他原因。这涵盖了我自己出现的95%,我的代码中包含了一些可用的提示。
我设法创建一个Injector.dll并将其注入游戏中(至少我认为它是注入的,到目前为止还没有任何可用的结果)
我有什么:
执行注入的文件:
...
// Try inject thingy
EasyHook.Config.Register("Star Citizen Noise.sc Client Overlay",
// "Direct3D9Hook.dll",
"SharpDX.dll",
"SharpDX.Direct3D11.dll",
"Injector.dll");
// Do the inject
RemoteHooking.Inject(scProcess.Id, InjectionOptions.DoNotRequireStrongName, "Injector.dll", "Injector.dll", "Star Citizen Noise.sc Injector.dll");
Console.WriteLine("DLL Injected.");
...
injector.dll本身由这个文件组成,名为Hooks / Graphics / Direct3D11Hook.cs(我试图保持结构类似于oter sc2参考项目)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Runtime.InteropServices;
using EasyHook;
using SharpDX;
using SharpDX.Direct3D11;
using Rectangle = SharpDX.Rectangle;
namespace Injector.Hooks.Graphics
{
public class Direct3D11Hook : HookBase
{
private Device device = null;
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
private delegate Result EndSceneDelegate(IntPtr devicePointer);
public delegate void EndSceneEventDelegate(ref IntPtr devicePointer);
public event EndSceneEventDelegate OnEndScene;
private Result EndScene(IntPtr devicePointer)
{
try
{
//this.Log.LogMethodSignatureTypesAndValues(devicePointer);
//GetOrCreateDevice
if (this.device == null)
this.device = Device.FromPointer<Device>(devicePointer);
if (this.OnEndScene != null)
this.OnEndScene(ref devicePointer);
System.Drawing.Graphics g = System.Drawing.Graphics.FromHdc(devicePointer);
//System.Drawing.Graphics g = System.Drawing.Graphics.FromHwndInternal(devicePointer);
// lets try to draw something
Pen myPen = new Pen(System.Drawing.Color.Pink, 4);
System.Drawing.Point P1 = new System.Drawing.Point(50, 50);
System.Drawing.Point P2 = new System.Drawing.Point(500, 500);
g.DrawLine(myPen, P1, P2);
g.Dispose();
//this.device.EndScene();
return Result.Ok;
}
catch (SharpDXException ex)
{
//Log.Warn(ex);
Console.WriteLine(ex);
return ex.ResultCode;
}
catch (Exception ex)
{
//this.Log.Fatal(ex);
Console.WriteLine(ex);
return Result.UnexpectedFailure;
}
}
public override void Install()
{
try
{
EndSceneDelegate esd = new EndSceneDelegate(this.EndScene);
}
catch (Exception)
{
throw;
}
}
public override void Uninstall()
{
}
}
}
这里我尝试为EndScene函数提供覆盖函数,因为我认为这是我需要的地方。毋庸置疑,似乎没有任何内容。
委托定义有点像copypaste from the reference project但是我还没有找到如何将我的函数实际挂钩到渲染管道和/或对可能有助于我的事业的事件作出反应。
还有这个巨大的文件[https://github.com/jasonpang/Starcraft2Hook/blob/master/Game/Hooks/Graphics/Direct3D9.cs]定义了似乎适用于DX9的函数地址,我认为它不能只是复制粘贴并用于DX11,所以可能有新的DX11中的功能地址?我怎么能找到那些?我需要在哪里看? SharpDX可以帮助我吗?
TL; DR
想要为DX11游戏创建类似蒸汽的叠加层,需要挂入D3D的东西和魔法和狗屎,得到dll注入工作,需要管道注入的帮助答案 0 :(得分:1)