从WPF的内部渲染到Directx应用程序

dec*_*ime 8 directx wpf overlay code-injection slimdx

我有一个WPF应用程序,用于在实时流中覆盖HUD.最初的想法是为xsplit(一种用于呈现实时流的流行应用程序)创建一个插件,以显示WPF应用程序的内容.这种方法的问题在于,向xsplit的COM接口渲染位图对于释放应用程序的CPU性能造成很大损害(我相信在xsplit的COM接口中存在问题以及使用RenderTargetBitmap对CPU征税).

我一直在寻找将叠加层直接渲染到游戏中(目标DirectX应用程序),因为它提供了许多好处.主要是它规避了xsplit中的性能问题,但也打开了应用程序,直到各种流和捕获应用程序.


我对DirectX不是很有经验,但我认为这是解决方案的大纲

  1. 初始化WPF应用程序并捕获WPF的Direct3d设备(通过此方法)

  2. 查找并挂钩目标DirectX应用程序的EndScene调用(使用EasyHook + Slimdx)

  3. 在钩住的DirectX应用程序的顶部渲染WPF设备表面的内容


我的主要问题是如何使用SlimDX完成第3步.我希望解决方案可以某种方式重用表面而不依赖于复制,因为目标是不影响钩子应用程序的性能.我也希望能够限制区域并支持透明度.我也想知道在钩住的DirectX应用程序的设备中使用WPF的Direct3d设备是否会导致任何不稳定.

任何见解都将不胜感激,谢谢.

L. *_*che 1

我正在尝试做同样的事情。到目前为止,我发现您可以将 wpfvisualtree 渲染为位图,然后将位图写入第 2 点中捕获的 d3d 设备。

void render(Direct3D.Device device)
{

wpfRenderTargetBitmap.Render(WpfVisualTree);
wpfRenderTargetBitmap.CopyPixels(devicePtr);

}
Run Code Online (Sandbox Code Playgroud)

我还没有测试过,但我认为我走在正确的轨道上。我现在遇到的唯一问题是我失去了窗口的所有交互性。按钮点击等将不再被捕获...

任何帮助都会很好。