IWebBrowser2:如何强制链接在新窗口中打开?

Rob*_*fee 5 c++ com internet-explorer iwebbrowser2

关于WebBrowser Customization的 MSDN 文档解释了如何防止打开新窗口以及如何取消导航。就我而言,我的应用程序托管了一个 IWebBrowser2,但我不希望用户导航到我的应用程序中的新页面。相反,我想在新的 IE 窗口中打开所有链接。所需的行为是:用户单击一个链接,并打开一个带有该 URL 的新窗口。

在这里提出并回答一个类似的问题,而不是污染已回答的帖子,建议我打开一个新的讨论。

相关帖子上的成员建议我应该能够通过捕获 DISPID_BEFORENAVIGATE2、设置取消标志并编写代码来打开新窗口来做到这一点,但我发现浏览器控件获得了很多BeforeNavigate2 事件,这些事件似乎由主页上的脚本启动。例如,amazon.com 疯狂地触发 BeforeNavigate2 事件,而且它们不是链接调用的结果。

回复赞赏!

Rob*_*fee 4

我最终做的是直接使用 IHTMLDocument 而不是 IWebBrowser。IWebBrowser 是 IHTMLDocument 的超集,并且 IWebBrowser 实现的导航模型无法按照我想要的程度进行自定义。

实际上,我得到了 MS 开发人员支持的支持,这种方法是他们的推荐。他们说这就是 Outlook 用于基于 HTML 的电子邮件的方式,这也是我想要模仿的用户体验。他们还确认,没有可靠的方法来过滤由用户操作产生的 OnBeforeNavigate 事件和由脚本活动产生的事件。

希望这可以帮助任何面临同样问题的人。移植代码以使用 IHTMLDocument 并不难。如果您最终这样做了,您可能还会发现自己正在寻找一种方法来确定文档何时完成加载。为此,请挂钩 HTMLDocumentEvents 而不是 DWebBrowserEvents,并查找 DISPID_HTMLDOCUMENTEVENTS_ONREADYSTATEANGE 事件。它不会告诉你什么是就绪状态;而是告诉你什么是就绪状态。您需要调用 IHTMLDocument::get_readyState 并解析结果字符串。傻傻的,但就这样吧。