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

DirectX, bouncing a directx rendering from a source hwnd to a new target hwnd

我有一个相当具有挑战性的主题正在努力弄清楚。

在 WPF/WinForms 内,我可以创建一个具有重大限制的 WebBrowser 组件,如果我可以将 directx 表面从 Web 浏览器控件反弹到我设置的 DirectX 表面,这些将是巨大的 resolved/reduced .

注意几点:

  1. WebBrowser 组件将 IWebBrowser2 OLE/ActiveX 组件托管在现有内容 "floating" window 之上,作为 WPF window 的子项 window =].

  2. 我知道并且可以得到(无需黑客)浮动的 HWND window;以及具有实际 Internet Explorer 组件的子类 HWND 运行.

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

我发现的潜在解决方案:

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

  2. "Redirect" HWND 的 directx 表面的选项已被 Microsoft 博客作者标记为 "trivial",但他们从未真正解释过如何操作。所以可能有一个更高级别的非 directx 非 gdi 方法,如果有人知道的话可能会起作用。

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

  4. 有没有一种方法可以从 OLE/COM 对象访问 directx 设备?...太棒了,使用 reflection/debuggers 我似乎找不到对它的任何引用。但这也有点 hack-y,因为我正在深入研究实现的内部结构。

是否有任何人可以提供任何指示、提示或指导,说明我如何以最小 "hackery" 和最大性能最好地完成此任务?

首先,我真的不认为您可以强制 WebBrowser 直接呈现到您的自定义 DirectDraw 表面上。但是,您可以提供 DD 表面的 HDC 以在其上绘制。

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

我还发布了一个使用 OleDraw(间接调用 IViewObject::Draw)的 somewhat related code