我有一个相当具有挑战性的主题,我想弄明白。
在WPF / WinForms中,我可以创建一个具有重大限制的WebBrowser组件,如果我可以将directx表面从Web浏览器控件反弹到我已设置的DirectX表面,这些组件将得到彻底解决/减少。
有几点需要注意:
WebBrowser组件在现有内容上方的“浮动”窗口中托管IWebBrowser2 OLE / ActiveX组件,作为WPF窗口的子窗口。
我知道并且可以获得(没有黑客)浮动窗口的HWND;以及运行实际Internet Explorer组件的子类的子类HWND。
我可以确认窗口是使用directX渲染的,但是我没有任何处理HWND之外的任何东西。我不知道它的渲染表面,设备或其他任何东西。
我发现的潜在解决方案:
BitBlt子窗口到WPF表面来解决问题;这是最后的选择,因为它需要一个计时器来捕获和更新位图。这似乎很浪费,似乎并不那么好。
“重定向”HWND的directx表面的选项已被微软博客作者称为“微不足道”,但他们从未真正解释过如何。因此,如果有人知道的话,可能会有一个非直接的非gdi方法更高级别的方法。
使用交换链将directx表面从源WebBrowser HWND弹回到新目标。这是我的最佳选择;但它很难开始,因为除了目标的HWND之外我没有任何东西。 (我不仅限于WPF,其他技术如OLE / COM / MFC / ATL / WinForms解决方案也很棒!)
有没有办法从OLE / COM对象访问directx设备?...一种冰雹结婚,使用反射/调试器我似乎无法找到任何引用它。但是,由于我正在深入研究实施的内部,这也有些骇人听闻。
是否有任何指针,提示或指示可以提供如何以最小的“hackery”和最高性能实现这一目标?
答案 0 :(得分:1)
首先,我真的不认为你可以强制WebBrowser直接渲染到你的自定义DirectDraw表面上。但是,您可以提供DD表面的HDC来绘制。
如果您想使用此功能,WebBrowser ActiveX控件将实现Windowless ActiveX Controls interfaces。理论上,您可以实现无窗口ActiveX主机并使用IViewObject::Draw
绘制到DD表面的HDC上。我无法预测这会是什么性能,但我怀疑它甚至会接近Trident渲染引擎的原生DirectDraw性能。
我还发布了一个使用OleDraw
的{{3}}(间接调用IViewObject::Draw
)。