Hook/Overlay a DirectX game?
Solution 1
(disclosure: I work for this company)
You can try our Deviare API, it has functionality to hook COM objects from C#. It's a set of COM objects that can be used from any programming language (supporting COM). An article with source code showing how to capture video and add an overlay is available: instrumenting Direct3D applications to capture video and calculate FPS
COM Spy Console and Direct Sound Capture are two examples that implements a console to hook COM objects like DirectX.
Hope it helps.
Solution 2
You can try my example on hooking the Direct3D 9 API using C#. This utilizes EasyHook an open source .NET assembly that allows you to install hooks from managed code into unmanaged functions.
SlimDX is also used - this is an open source managed wrapper around the Direct3D libraries.
The tricky part of the hooking is determining the addresses of a COM objects' virtual functions. This is done in the above example using a small C++ helper DLL that finds the addresses from the VTable. [Update: there is a comment posted that show's how to get the function pointers from the VTable in C# also - given a IntPtr to the com object]
The example hooks the EndScene method of an IDirect3DDevice9, which is also where you would want to draw any overlays. As to displaying a form in the overlay I'm not so sure that will be so easy - I mean you can render the image easily enough, but you will have to capture inputs and manually respond/pass-thru the events to the form in question appropriately. Good luck!
Solution 3
Since you don't have direct DirectX Access from C# this may be tricky.
From my limited understanding of the concept:
DirectX Hooks consist of attaching to a DirectX Context and manipulating it, this may/may not require messing with another program's memory, something that's best suited to C/C++
I may be wrong though, however this is an advanced topic and my gut tells me you may have issues under .NET
Related videos on Youtube
Joey Morani
Updated on July 29, 2020Comments
-
Joey Morani almost 4 years
Can anyone tell me how to hook/overlay a DirectX game in C#?
I've tried getting a fullscreen C# window to overlap a game, however it wont. After researching a little, I found out that I need to hook the game and then display the C# window.
Can anyone explain how I would do this? Would I be able to display a C# form over a DirectX game?
-
Joey Morani about 14 yearsHow about doing the hooking with C++, and then running the C# Program from within the hook? Wouldn't that make the C# program show, or doesn't it work like that?
-
Joey Morani about 14 yearsThanks. I've applied for it. Could you explain how I could get the Deviare API to hook a directx game, and display something? Thanks again.
-
sw. about 14 yearsYou can ask questions in the related forums there. My recommendation is using the articles as a starting point.
-
Justin Stenning about 13 yearsHere's an updated version that has a very simple Overlay example - also 100% C#: Direct3D 9,10 overlay
-
Jason over 11 yearsNo, you can't show a C# program within unmanaged C++ like that. One common suggestion is to use C++/CLI for a managed/unmanaged C++ wrapper half-interfacing with DirectX but also half of a "managed" library that C# can directly call. But it looks ugly. Spazzarrama (Justin S. ^)'s example of hooking and overlaying works perfectly and was an invaluable resource.
-
Mathias Lykkegaard Lorenzen about 11 yearsThat does not solve the problem for others. Please describe what the solution is.
-
sw. almost 11 years@MathiasLykkegaardLorenzen source code for adding an overlay and capturing video using Deviare is available at: github.com/nektra/AVRecorderTool
-
smedasn over 3 yearslink is down unfortunately