DirectX,将 directx 渲染从源 hwnd 弹跳到新的目标 hwnd



我有一个相当具有挑战性的主题,我试图弄清楚。

在WPF/WinForms中,我可以创建一个具有重大限制的WebBrowser组件,如果我可以将directx图面从Web浏览器控件反弹到我已设置的DirectX图面,这些限制将得到彻底解决/减少。

需要注意的几点:

  1. Web 浏览器组件将 IWebBrowser2 OLE/ActiveX 组件托管在现有内容上方的"浮动"窗口中,作为 WPF 窗口的子窗口。

  2. 我知道并且可以(没有黑客)浮动窗口的HWND;以及运行实际Internet Explorer组件的子类化的HWND。

  3. 我可以确认窗口正在使用 directX 渲染,但我没有任何句柄可以处理 HWND 之外的任何内容。我不知道它渲染到的表面、设备或其他任何东西。

我发现的潜在解决方案:

  1. BitBlt 子窗口到 WPF 图面以解决问题;这是最后的选择,因为它需要一个计时器来捕获和更新位图。 这似乎很浪费,而且似乎不是那么好。

  2. "重定向"HWND的directx表面的选项已被Microsoft博客作者指出为"微不足道",但他们从未真正解释过如何。因此,可能有一种非 directx 非 gdi 方法,如果有人知道它,它可能会起作用。

  3. 使用交换链将 directx 图面从源 Web 浏览器 HWND 反弹到新目标。这是我的最佳选择;但它甚至很难开始,因为我除了目标的 HWND 之外没有其他任何东西。(我不仅限于WPF,其他技术,如OLE/COM/MFC/ATL/WinForms解决方案都很棒!)

  4. 有没有办法从 OLE/COM 对象访问直接 x 设备?... 有点像冰雹结婚,使用反射/调试器我似乎找不到任何对它的引用。 但这也有点黑客,因为我正在深入研究实现的内部。

是否有任何指示、提示或方向,任何人都可以提供关于我如何以最小的"黑客"和最大的性能最好地实现这一目标?

首先,我真的不认为你可以强制WebBrowser直接渲染到你的自定义DirectDraw表面上。但是,您也许能够提供要绘制的 DD 表面的 HDC。

如果你想玩这个,WebBrowser ActiveX控件实现Windowless ActiveX控件接口。理论上,您可以实现一个无窗口的 ActiveX 主机,并使用IViewObject::Draw绘制到 DD 表面的 HDC 上。我无法预测它的性能会是什么,但我怀疑它甚至会接近 Trident 渲染引擎的原生 DirectDraw 性能。

我还发布了一个使用OleDraw(间接调用IViewObject::Draw)的有点相关的代码。

最新更新