获取WebBrowser.NewWindow事件的URL

本文关键字:URL 事件 NewWindow WebBrowser 获取 | 更新日期: 2023-09-27 17:59:15

我正在尝试将新的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是否是获得新窗口url的最佳方式(这并不适用于我测试过的每个网站)。

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


更新:

我试过Charlie 建议的解决方案

  1. 添加了Microsoft Internet控件(COM)引用
  2. 使用SHDocVw添加
  3. 使用的代码:

    System.Windows.Forms.WebBrowser myWebBrowser=新的System.Windows.Fforms.WebBrowser()
    SHDocVw.WebBrowser axBrowser=(SHDocVw.WebBrowser)myWebBrowserActiveInstance
    axBrowser.NewWindow3+=新的DWebBrowserEvents2_NewWindow3EventHandler(Browser_NewWindow3);

不幸的是,我在第三行收到了一个无法更正的NullReference Exception


解决方案:

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

  • 讨论
  • 原文(页面为中文,但代码为可读)

建议将前三行修改为以下行:

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

现在一切都正常了,我能够在剩下的所有代码中继续使用原始的System.Windows.Forms.WebBrowser

获取WebBrowser.NewWindow事件的URL

看起来WebBrowser控件是围绕SHDocVw的一个非常蹩脚的包装器。幸运的是,Microsoft通过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);