2014-05-25 12 views
5

Quello che voglio fare:Disegno Overlay all'interno DX11 gioco (CryEngine) con C# e EasyHook

Ho un gioco basato su CrySDK che è DirectX11 e voglio disegnare un overlay in gioco, come la sovrapposizione di vapore.

-> Scrivo C# poiché non conosco alcun C++, quindi sto cercando modi per farlo in C#.

-> Uso le Libaries EasyHook e SharpDX perché sembra che questo sia il modo migliore per andare.

-> Ho trovato un reference project che è apparentemente una sorta di hack per SC2, mi interessa solo la parte di overlay tuttavia.

-> Io uso Visual Studio 2013

-> Per ora sarei felice se potessi disegnare cose a caso all'interno di un gioco a tutti

Quello che ho fatto finora:

Guardavo attraverso google e SO i risultati di ricerca, il problema è che sia roba in C++, C o altro, i risultati sono del 2010 e non aggiornati con il dx11 corrente, contengono collegamenti morti o sono inutilizzabili per qualsiasi altro motivi. Questo copre il 95% di tutto ciò che ho scoperto personalmente, alcuni suggerimenti utili sono stati inclusi nel mio codice.

sono riuscito a creare un Injector.dll e iniettare nel gioco (almeno penso che sia iniettato, non hanno avuto alcun risultato usuable finora)

Quello che ho:

il file che fa l'iniezione:

...     
// 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."); 
... 

L'injector.dll sé consiste di questo file, chiamato Ganci/grafica/Direct3D11Hook.cs (ho cercato di mantenere la struttura simile al progetto di riferimento SC2 oter)

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() 
     { 

     } 

    } 
} 

Qui ho provato a fornire una funzione di override per la funzione EndScene, perché penso che questo sia il posto dove devo essere. Inutile dire che nulla sembra essere disegnato.

Le definizioni dei delegati sono in qualche modo un copypaste from the reference project tuttavia non ho ancora trovato come collegare effettivamente la mia funzione nella pipeline di rendering e/o reagire agli eventi che potrebbero aiutare la mia causa.

C'è anche questo enorme file [https://github.com/jasonpang/Starcraft2Hook/blob/master/Game/Hooks/Graphics/Direct3D9.cs] che definisce gli indirizzi di funzione che sembra funzionare per DX9, non penso che possa essere semplicemente copiato e usato per DX11, quindi probabilmente ci sono nuovi indirizzi di funzione in DX11? Come posso trovarli? Dove devo guardare? È qualcosa con cui SharpDX può aiutarmi?

TL; DR

Vuoi creare sovrapposizione di vapore come per DX11 gioco, hanno bisogno di collegare in roba D3D e magia e merda, ma ho dll iniettare lavoro, hanno bisogno di aiuto con tubazione di iniezione

+0

Buono a sapersi Non sono l'unico ad avere problemi a trovare informazioni affidabili per un overlay. Il tuo gioco è in modalità schermo intero o con finestra? Sono in grado di eseguire operazioni di sovrapposizione su tutti i giochi di finestre dx, ma non sulla modalità a schermo intero. Puoi provare la modalità a finestra e vedere se qualcosa si presenta nel tuo overlay. – Tyler

risposta