【发布时间】:2015-03-13 00:20:21
【问题描述】:
我有一个相当具有挑战性的课题,我正在努力解决。
在 WPF/WinForms 中,我可以创建一个具有重大限制的 WebBrowser 组件,如果我可以将 DirectX 表面从 Web 浏览器控件反弹到我已设置的 DirectX 表面,这些将大大解决/减少。
需要注意的几点:
WebBrowser 组件在现有内容上方的“浮动”窗口中托管 IWebBrowser2 OLE/ActiveX 组件,作为 WPF 窗口的子窗口。
我知道并且可以(无需破解)浮动窗口的 HWND;以及运行实际 Internet Explorer 组件的子级 HWND。
我可以确认窗口正在使用 directX 进行渲染,但我没有任何句柄来处理 HWND 之外的任何内容。我不知道它渲染到的表面、设备或其他任何东西。
我发现的潜在解决方案:
BitBlt 子窗口到 WPF 表面来解决问题;这是最后的选择,因为它需要一个计时器来捕获和更新位图。这似乎很浪费,而且似乎不是那么好。
“重定向”HWND 的 directx 表面的选项已被 Microsoft 博客作者指出为“微不足道”,但他们从未真正解释过如何。因此,如果有人知道的话,可能会有一种更高级的 non-directx 非 gdi 方法。
使用交换链将 directx 表面从源 WebBrowser HWND 反弹到新目标。这是我的最佳选择;但它甚至很难开始,因为除了目标的 HWND 之外我没有任何其他东西。 (我不限于 WPF,其他技术如 OLE/COM/MFC/ATL/WinForms 解决方案都很棒!)
有没有一种方法可以从 OLE/COM 对象访问 directx 设备?... 有点高兴,使用反射/调试器我似乎找不到任何对它的引用。但这也有点 hack-y,因为我正在深入研究实现的内部。
是否有任何人可以提供关于我如何以最少的“黑客行为”和最大的性能最好地完成此任务的任何指针、提示或方向?
【问题讨论】:
标签: wpf directx webbrowser-control ole iwebbrowser2