有关 WebBrowser Customization 的 MSDN 文档解释了如何防止打开新窗口以及如何取消导航。在我的例子中,我的应用程序托管了一个 IWebBrowser2,但我不希望用户导航到我的应用程序中的新页面。相反,我想在新的 IE 窗口中打开所有链接。所需的行为是:用户单击一个链接,然后打开一个包含该 URL 的新窗口。
有人提出并回答了类似的问题here并且建议我打开一个新的讨论,而不是污染那个回答的帖子。
相关帖子中的成员建议我应该能够通过捕获 DISPID_BEFORENAVIGATE2、设置取消标志和编写代码来打开一个新窗口来做到这一点,但我发现浏览器控件得到很多 似乎由主页上的脚本启动的 BeforeNavigate2 事件。例如,amazon.com 疯狂地触发 BeforeNavigate2 事件,它们不是链接调用的结果。
感谢回复!
最佳答案
我最终做的是直接使用 IHTMLDocument 而不是 IWebBrowser。 IWebBrowser 是 IHTMLDocument 的超集,IWebBrowser 实现的导航模型不能按照我想要的程度进行定制。
我实际上让 MS 开发人员支持参与进来,这种方法是他们推荐的。他们说这就是 Outlook 用于基于 HTML 的电子邮件的方式,这是我想要效仿的用户体验。他们还确认,没有可靠的方法来过滤用户操作产生的 OnBeforeNavigate 事件和脚本事件产生的事件。
希望这对面临同样问题的人有所帮助。移植代码以使用 IHTMLDocument 并不难。如果您最终这样做,您可能还会发现自己正在寻找一种方法来确定文档何时完成加载。为此, Hook HTMLDocumentEvents 而不是 DWebBrowserEvents,并查找 DISPID_HTMLDOCUMENTEVENTS_ONREADYSTATECHANGE 事件。它不会告诉您就绪状态是什么;您需要调用 IHTMLDocument::get_readyState 并解析结果字符串。高飞,但你走了。
关于c++ - IWebBrowser2:如何强制链接在新窗口中打开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2925279/