【问题标题】:IWebBrowser2 issues - how to open documents in new windows?IWebBrowser2 问题 - 如何在新窗口中打开文档?
【发布时间】:2009-09-22 12:44:32
【问题描述】:

我将 IWebBrowser2 ctrl 嵌入到我自己的对话框中。我想简单地 从我的网址中显示一个促销横幅。如何禁用所有弹出窗口 来自控件的菜单项并强制它在新窗口中打开链接 (目前当我点击横幅中的链接时,它正在被打开 在同一控制范围内)。 问候 多米尼克

【问题讨论】:

    标签: c++ com iwebbrowser2


    【解决方案1】:

    看看下面的文章:

    WebBrowser Customization

    【讨论】:

    • MSDN 文章是一个很好的资源,但它没有回答这个问题。 MSDN 解释了如何prevent 新窗口,而不是如何强制打开新窗口。文档暗示您可以通过挂钩 DISPID_BEFORENAVIGATE2 事件来做到这一点,但该事件没有足够的上下文来区分用户单击链接和基于脚本的活动。例如,如果您加载 amazon.com,初始页面加载将触发一堆其他请求,这些请求会导致它们自己的 BeforeNavigate 事件。
    【解决方案2】:

    我不知道是否有更方便的方法来执行此操作 - 但您始终可以拦截 BeforeExplorerNavigate2(),将 out-parameter cancel 设置为 true,然后从那里使用不同的目标执行新的 Navigate()框架名称或打开一个新窗口。

    正如 Rob 指出的那样,过滤掉源自脚本的导航事件可能存在问题,请参阅this question

    【讨论】:

    • 如何注册 IWebBrowser2 活动?我只有 IWebBrowser2 对象。
    • 您实现 DWebBrowserEvents2 并为此注册为事件接收器。通过 Remys 文章,您会发现 NewWindow3() 事件,它应该可以满足您的需求。
    • 好的。谢谢,我发现它虽然在 WTL 中不像在 MFC 中那么容易。
    • Georg,请参阅我上面的评论——这个问题仍未得到解答。我正在尝试做同样的事情,到目前为止我还没有找到可靠的解决方案。捕获 DISPID_BEFORENAVIGATE2 的关键问题是您无法判断它是用户启动的还是脚本启动的。
    • @Rob:显然这个问题已经为 OP 回答了......无论如何,您可以通过 pDisp 参数识别请求源自的框架 - 如果您不知道如何打开关于它的新问题。
    猜你喜欢
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 2014-03-24
    相关资源
    最近更新 更多