3

我正在尝试将新的 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
}

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

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


更新:

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

  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 Exception 错误。
无论如何,我发现了这两个帖子:

建议是将前三行修改为这一行:

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

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

4

1 回答 1

8

看起来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);
于 2013-02-14T17:35:34.800 回答