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

标签 c++ internet-explorer com iwebbrowser2

有关 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/

相关文章:

c# - 在 C# 中使用 ref 数组参数与 COM 互操作

c++ - 从文件读取错误(读取 0 或 ""值)

python - HTML 火狐书签

html - 将文本换行至浏览器宽度或指定宽度(以较小者为准)

windows - 是什么决定 RegisterTypeLib 是写入 win32 还是 win64?

c++ - "Set"C++中批量COM对象属性

c++ - 了解通过 RInside 将 Armadillo 矩阵传递给 R 函数

c++ - 带双引号的字符串初始化

c++ - 如何在一台 Linux 上使用 C++ 从触摸屏获取输入。

javascript - 编码字符破坏了 IE8 上的 Knockout js 数据绑定(bind)