En los últimos días se me ha planteado la necesidad de trabajar con el navegador web pero no incrustado dentro de nuestra aplicación sino de forma externa a ella. Además me interesaba trabajar con una única instancia del navegador de forma que cada vez que se quisiese visualizar una página nueva se recargase la instancia activa en ese momento.
El primer planteamiento que hice fue el siguiente:
using System;
using System.Windows.Forms;
using System.Diagnostics;
namespace ManejandoNavegador
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void buttonGo_Click(object sender, EventArgs e)
{
Process.Start("IEXPLORE.EXE", textBoxURL.Text);
}
}
}
Con esta solución cada vez que se visualizaba una página se lanzaba una nueva instancia del navegador, por lo tanto fue descartada.
Una segunda solución planteada es la que se muestra a continuación:
using System;
using System.Windows.Forms;
using System.Diagnostics;
namespace ManejandoNavegador
{
public partial class Form1 : Form
{
Process navegador;
public Form1()
{
InitializeComponent();
}
private void buttonGo_Click(object sender, EventArgs e)
{
if (navegador!=null)
{
navegador.Kill();
}
navegador= Process.Start("IEXPLORE.EXE", textBoxURL.Text);
}
}
}
Con esta solución conseguimos que solo haya una instancia del navegador gracias a que cada vez que lanzamos una instancia nueva se cierra la instancia anterior. Esto provoca cierto parpadeo al cerrar una instancia y lanzar otra nueva. Esto hizo que se descartara también esta ultima solución.
Finalmente decidí utilizar la siguiente solución añadiendo la referencia al COM Microsoft Internet Controls y añadiendo el “using SHDocVw”:
using System;
using System.Windows.Forms;
using System.Diagnostics;
using SHDocVw;
namespace ManejandoNavegador
{
public partial class Form1 : Form
{
InternetExplorer explorer;
public Form1()
{
InitializeComponent();
}
private void buttonGo_Click(object sender, EventArgs e)
{
if (explorer==null)
{
explorer= new InternetExplorer();
explorer.Visible = true;
}
object Emtry = 0;
explorer.Navigate(textBoxURL.Text, ref Emtry, ref Emtry, ref Emtry, ref Emtry);
}
}
}
De este modo se consiguió visualizar las páginas deseadas sobre una misma instancia del navegador. El usuario simplemente apreciará que la página se recarga con cada página nueva.