Abrir enlace en TAB nueva (control WebBrowser)

¿Alguien sabe cómo hacer clic en un enlace en el control WebBrowser en una aplicación WinForms y luego abrir ese enlace en una nueva pestaña dentro de mi TabControl?

He estado buscando durante meses, he visto muchos tutoriales / artículos / muestras de código, pero parece que nadie ha intentado esto con C # antes.

Cualquier consejo / muestra es muy apreciado.

Gracias.

En función de sus comentarios, entiendo que desea atrapar la acción “Abrir en una nueva ventana” para el control WebBrowser y reemplazar el comportamiento predeterminado para abrir en una nueva pestaña dentro de su aplicación.

Para lograr esto de forma confiable, debe obtener en el evento NewWindow2, que expone ppDisp (un puntero configurable para el control WebBrowser que debe abrir la nueva ventana). Todas las demás soluciones potenciales pirateadas (como la obtención del último enlace seleccionado por el usuario antes del evento OpenWindow) no son óptimas y pueden fallar en casos de esquina.

Afortunadamente, hay una manera (relativamente) simple de lograr esto sin dejar de usar el control System.Windows.Forms.WebBrowser como base. Todo lo que necesita hacer es extender WebBrowser e interceptar el evento NewWindow2 mientras proporciona acceso público a la instancia de ActiveX (para pasar a ppDisp en tabs nuevas). Esto se ha hecho antes, y Mauricio Rojas tiene un excelente ejemplo con una clase trabajadora completa “ExtendedWebBrowser”:

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

Una vez que tenga la clase ExtendedWebBrowser, todo lo que necesita hacer es configurar controladores para NewWindow2 y señalar ppDisp a un navegador en una nueva pestaña. Aquí hay un ejemplo que armé:

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); } 

(Asume TabControl con el nombre “Pestañas” y la pestaña inicial que contiene el control infantil acoplado ExtendedWebBrowser llamado “InitialWebBrowser”)

¡No olvide anular el registro de los eventos cuando las tabs estén cerradas!

 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; } 

El siguiente código funciona, solo sigue la primera respuesta para crear la clase ExtendedWebBrowser.

Estoy usando esto para abrir una nueva pestaña, pero también funciona para abrir una nueva ventana con su navegador y no con IE.

Espero eso ayude.

  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); } 

Hice un poco de investigación sobre este tema y no es necesario hacer todas las tuberías de COM que están presentes en la clase ExtendedWebBrowser, ya que ese código ya está presente en el Interop.SHDocVw generado. Como tal, pude usar el constructo más natural a continuación para suscribirme al evento NewWindow2. En Visual Studio tuve que agregar una referencia a “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); } 

Lea http://bit.ly/IDWm5A para obtener más información. Esta es la página 5 de la serie, para una comprensión completa tuve que volver y leer las páginas 3 -> 5.

Simplemente cancele el evento de la nueva ventana y maneje la navegación y las tabs usted mismo.

Aquí hay un ejemplo completamente funcional. Esto supone que tiene un tabcontrol y al menos una página de pestaña en su lugar.

 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; } } } 

No hay tabulación en el control del navegador web, por lo que debe manejar las tabs usted mismo. Agregue un control de ficha sobre el control del navegador web y cree nuevos controles de navegador web cuando se abran nuevas tabs. Capture y cancele cuando el usuario abra ventanas nuevas y abra tabs nuevas.