我想将WPF窗口渲染到我自己的缓冲区中,并将其添加到渲染循环中,渲染到我自己的场景中,进行操作等。
是否有内置的方法来捕获WPF窗口的底层DirectX缓冲区/交换链?
答案 0 :(得分:3)
可能,但并不容易。
耶利米·莫里尔(Jeremiah Morrill)在尝试实现这一目标时发现了两篇很棒的文章。
A Critical Deep Dive into the WPF Rendering System
How to get access to WPF’s internal Direct3D guts
耶利米使用用C ++编写的Dynamic Link Library (DLL)
钩住DirectX函数,并导出其中用C#调用的initialise
函数。
这仍然不会阻止您使用Easyhook并以C#而非耶利米斯的方式进行操作。
当我自己这样做时,这就是我的流程:
我的经验:在速度上有一个折衷,但是我相信优化可能是可行的解决方案。
另一种解决方案
您可以通过钩子由于WPF在引擎盖下使用DirectX 9,因此无法使用。D3D11CreateDeviceAndSwapChain
来钩住d3d11.dll
。
在周末反转WPF之后,我发现未托管的wpfgfx.dll
包含milcore
,这是迄今为止DirectX 9的包装。您可以在下图的WPF体系结构中看到这一点。
在模块wpfgfx.dll
中,它包含MILCore DirectX包装器。有关WPF Architecture