【问题标题】:Get URL for WebBrowser.NewWindow Event [duplicate]获取 WebBrowser.NewWindow 事件的 URL [重复]
【发布时间】:2013-01-30 01:01:46
【问题描述】:

我正在尝试将新的 Window 事件重定向到新选项卡:

myWebBrowser.NewWindow += add_NewTab; 

//...

private void add_NewTab(object sender, CancelEventArgs e)
{ 
    WebBrowser thisWebBrowser = (WebBrowser)sender;
    e.Cancel = true; //should block the default browser to open a new window

    TabPage addedTabPage = new TabPage("redirected tab"); //create a new tab
    tabControl_webBrowsers.TabPages.Add(addedTabPage); //add the new tab to the TabControl
    WebBrowser addedWebBrowser = new WebBrowser() //create the new web browser inside the new tab
    {
        Parent = addedTabPage,
        Dock = DockStyle.Fill
    };

    addedWebBrowser.Navigate(thisWebBrowser.StatusText.ToString()); //set the new browser destination url
}

我不确定使用WebBrowser.StatusText 是获取新窗口网址的最佳方式(这不适用于我测试过的每个网站)。

是否有更好的类/方法来调用来获取新的窗口目标?


更新:

我已经尝试过查理建议的解决方案

  1. 添加了 Microsoft Internet Control (COM) 参考
  2. 使用 SHDocVw 添加;
  3. 使用代码:

    System.Windows.Forms.WebBrowser myWebBrowser = new System.Windows.Forms.WebBrowser();
    SHDocVw.WebBrowser axBrowser = (SHDocVw.WebBrowser)myWebBrowser.ActiveXInstance;
    axBrowser.NewWindow3 += new DWebBrowserEvents2_NewWindow3EventHandler(Browser_NewWindow3);

很遗憾,我在第三行收到了 NullReference Exception,但我无法更正。


解决方案:

我认为解决方案不在相关答案中(或者我无法找到它),因为它解释了如何实现 NewWindow2 事件(而不是处理原始目标 url 的 NewWindow3)并且实现是这里建议的相同会导致 NullReference 异常错误。
无论如何,我发现了这两个帖子:

建议将前面三行修改成这一行:

(myWebBrowser.ActiveXInstance as SHDocVw.WebBrowser).NewWindow3 += new SHDocVw.DWebBrowserEvents2_NewWindow3EventHandler(Browser_NewWindow3);

现在一切正常,我能够在所有其余代码中继续使用原始 System.Windows.Forms.WebBrowser

【问题讨论】:

  • 我的答案是 NewWindow3,您用来实现我上面发布的答案的示例代码也是如此。这看起来几乎完全是我提供的解决方案,除了在您尝试实现它时,您创建了 Web 浏览器控件的新实例,并且从未将其添加到表单中,而是使用表单上已有的控件。这可能是它不起作用的原因。
  • 是的,在“解决方案”段落中,我指的是第一行:这个问题在这里已经有了答案。关于您的建议,我知道我使用了两个不同的对象:“原始” System.Windows.Forms.WebBrowser 和“您的” SHDocVw.WebBrowser 没有将其插入表单,但属性 SHDocVw.WebBrowser.Parent 不可写。非常感谢您的帮助,如果您有更清洁的解决方案,请告诉我,也许只实现 SHDocVw.WebBrowser。
  • 万一其他人通过这里,我发现我必须将“Interop.SHDocVw”程序集的“嵌入互操作类型”设置为 false,并将“本地副本”设置为 true。 social.msdn.microsoft.com/Forums/vstudio/en-US/…
  • 你使用 StatusText 来获取 url 吗?

标签: c# browser new-window


【解决方案1】:

看起来WebBrowser 控件是SHDocVw 的一个非常糟糕的包装器。幸运的是微软通过WebBrowser.ActiveXInstance公开了底层实现。

http://www.codeproject.com/Articles/71592/How-to-easily-capture-the-NewWindow3-event-and-det 的这段代码可以解决问题:

首先,添加对Microsoft Internet Controls 的引用。然后实现一个 NewWindow3 处理程序:

SHDocVw.WebBrowser axBrowser = (SHDocVw.WebBrowser)webBrowser.ActiveXInstance;
axBrowser.NewWindow3 += new DWebBrowserEvents2_NewWindow3EventHandler(Browser_NewWindow3);

【讨论】:

  • 感谢您的帮助。我遵循了您的建议,但收到了 NullReference 异常
  • @Mave751 我也有一个,但(SHDocVw.WebBrowser_V1)browser.ActiveXInstance 仅在创建后才显示为空 - 将计时器设置为 5 秒的快速测试表明它稍后不为空 - 所以解决方法可以是 A)开始在计时器上检查 null 直到它不是(然后强制转换并设置回调)和 B)阻止 UI 交互或隐藏浏览器直到(A)完成。类似的事情 - 想知道我是否是唯一一个对互联网上散布的“只要投吧,伙计”的建议不满意的人 - 事实证明,我不是。
  • .. 或者更好,只需使用 "Form.onLoad()" —— 实际上,activeX 实例不再为空,就像在 stackoverflow.com/questions/6470842/… 中一样,实际上
猜你喜欢
  • 2018-07-27
  • 2022-01-04
  • 2013-02-24
  • 2018-05-08
  • 1970-01-01
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多