在新TAB中打开链接(WebBrowser控件)

有人知道如何在WinForms应用程序中单击WebBrowser控件中的链接,然后在我的TabControl中的新选项卡中打开该链接吗?

我已经搜索了几个月,看过很多教程/文章/代码示例,但似乎没有人曾经在C#中尝试过这个。

任何建议/样品都非常感谢。

谢谢。

根据您的评论,我了解您希望捕获WebBrowser控件的“在新窗口中打开”操作,并覆盖默认行为以在应用程序内的新选项卡中打开。

要可靠地完成此任务,您需要获取NewWindow2事件,该事件公开ppDisp(一个可设置的指向应该打开新窗口的WebBrowser控件的指针)。 所有其他潜在的黑客攻击解决方案(例如获取用户在OpenWindow事件之前选择的最后一个链接)都不是最佳的,并且在极端情况下必然会失败。

幸运的是,有一种(相对)简单的方法来实现这一点,同时仍然使用System.Windows.Forms.WebBrowser控件作为基础。 您需要做的就是扩展WebBrowser并拦截NewWindow2事件,同时提供对ActiveX实例的公共访问(用于在新选项卡中传递到ppDisp)。 这是以前完成的,Mauricio Rojas有一个很好的例子,有一个完整的工作类“ExtendedWebBrowser”:

http://blogs.artinsoft.net/mrojas/archive/2008/09/18/newwindow2-events-in-the-c-webbrowsercontrol.aspx

获得ExtendedWebBrowser类之后,您需要做的就是为NewWindow2设置处理程序,并在新选项卡中将ppDisp指向浏览器。 这是我放在一起的一个例子:

private void InitializeBrowserEvents(ExtendedWebBrowser SourceBrowser) { SourceBrowser.NewWindow2 += new EventHandler(SourceBrowser_NewWindow2); } void SourceBrowser_NewWindow2(object sender, NewWindow2EventArgs e) { TabPage NewTabPage = new TabPage() { Text = "Loading..." }; ExtendedWebBrowser NewTabBrowser = new ExtendedWebBrowser() { Parent = NewTabPage, Dock = DockStyle.Fill, Tag = NewTabPage }; e.PPDisp = NewTabBrowser.Application; InitializeBrowserEvents(NewTabBrowser); Tabs.TabPages.Add(NewTabPage); Tabs.SelectedTab = NewTabPage; } private void Form1_Load(object sender, EventArgs e) { InitializeBrowserEvents(InitialTabBrowser); } 

(假设TabControl名为“Tabs”,并且包含名为“InitialWebBrowser”的子控件停靠的ExtendedWebBrowser的初始选项卡)

选项卡关闭时,不要忘记取消注册事件!

 private Uri _MyUrl; System.Windows.Forms.WebBrowser browser = new System.Windows.Forms.WebBrowser(); browser.Navigating += new System.Windows.Forms.WebBrowserNavigatingEventHandler(browser_Navigating); void browser_Navigating(object sender, System.Windows.Forms.WebBrowserNavigatingEventArgs e) { _MyUrl = e.Url; e.Cancel; } 

以下代码可以正常工作,只需按照第一个回复创建ExtendedWebBrowser类即可。

我正在使用它打开一个新选项卡,但它也可以使用您的浏览器而不是IE打开一个新窗口。

希望能帮助到你。

  private void Window_Loaded(object sender, RoutedEventArgs e) { if (current_tab_count == 10) return; TabPage tabPage = new TabPage("Loading..."); tabpages.Add(tabPage); tabControl1.TabPages.Add(tabPage); current_tab_count++; ExtendedWebBrowser browser = new ExtendedWebBrowser(); InitializeBrowserEvents(browser); webpages.Add(browser); browser.Parent = tabPage; browser.Dock = DockStyle.Fill; browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted); browser.DocumentTitleChanged += new EventHandler(Browser_DocumentTitleChanged); browser.Navigated += Browser_Navigated; browser.IsWebBrowserContextMenuEnabled = true; public void InitializeBrowserEvents(ExtendedWebBrowser browser) { browser.NewWindow2 += new EventHandler(Browser_NewWindow2); } void Browser_NewWindow2(object sender, ExtendedWebBrowser.NewWindow2EventArgs e) { if (current_tab_count == 10) return; TabPage tabPage = new TabPage("Loading..."); tabpages.Add(tabPage); tabControl1.TabPages.Add(tabPage); current_tab_count++; ExtendedWebBrowser browser = new ExtendedWebBrowser(); webpages.Add(browser); browser.Parent = tabPage; browser.Dock = DockStyle.Fill; browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted); browser.DocumentTitleChanged += new EventHandler(Browser_DocumentTitleChanged); browser.Navigated += Browser_Navigated; tabControl1.SelectedTab = tabPage; browser.Navigate(textBox.Text); { e.PPDisp = browser.Application; InitializeBrowserEvents(browser); } 

我对此主题进行了一些研究,并且不需要执行ExtendedWebBrowser类中存在的所有COM管道,因为该代码已经存在于生成的Interop.SHDocVw中。 因此,我能够使用下面更自然的构造来订阅NewWindow2事件。 在Visual Studio中,我不得不添加对“Microsoft Internet Controls”的引用。

  using SHDocVw; ... internal WebBrowserSsoHost(System.Windows.Forms.WebBrowser webBrowser,...) { ParameterHelper.ThrowOnNull(webBrowser, "webBrowser"); ... (webBrowser.ActiveXInstance as WebBrowser).NewWindow2 += OnNewWindow2; } private void OnNewWindow2(ref object ppDisp, ref bool Cancel) { MyTabPage tabPage = TabPageFactory.CreateNewTabPage(); tabPage.SetBrowserAsContent(out ppDisp); } 

有关更多信息,请阅读http://bit.ly/IDWm5A 。 这是本系列中的第5页,为了完全理解,我必须回过头来阅读第3页 – > 5页。

您只需取消新窗口事件并自行处理导航和标签内容。

这是一个完整的例子。 这假设您有一个tabcontrol和至少1个标签页。

 using System.ComponentModel; using System.Windows.Forms; namespace stackoverflow2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.webBrowser1.NewWindow += WebBrowser1_NewWindow; this.webBrowser1.Navigated += Wb_Navigated; this.webBrowser1.DocumentText= ""+ "Title"+ ""+ " test "+ ""+ ""; } private void WebBrowser1_NewWindow(object sender, CancelEventArgs e) { e.Cancel = true; //stop normal new window activity //get the url you were trying to navigate to var url= webBrowser1.Document.ActiveElement.GetAttribute("href"); //set up the tabs TabPage tp = new TabPage(); var wb = new WebBrowser(); wb.Navigated += Wb_Navigated; wb.Size = this.webBrowser1.Size; tp.Controls.Add(wb); wb.Navigate(url); this.tabControl1.Controls.Add(tp); tabControl1.SelectedTab = tp; } private void Wb_Navigated(object sender, WebBrowserNavigatedEventArgs e) { tabControl1.SelectedTab.Text = (sender as WebBrowser).DocumentTitle; } } } 

Web浏览器控件中没有标签,因此您需要自己处理标签。 在Web浏览器控件上方添加选项卡控件,并在打开新选项卡时创建新的Web浏览器控件。 当用户打开新窗口并打开新选项卡时捕获并取消。