Cómo crear un navegador web de varias páginas usando C#
Análisis técnico clave
La clave para solucionar el problema reside en la programación del evento NewWindow2 del control del navegador WebBrowser. Cuando es necesario abrir una nueva ventana para mostrar un determinado archivo, se activa el evento NewWindow2
. Tenga en cuenta que este evento ocurre antes de que se genere la nueva ventana del control WebBrowser. Por ejemplo, este evento ocurre en respuesta a la navegación a una nueva ventana o a un método window.open controlado por script. Para declarar que cuando se abra una nueva ventana, se utilizará nuestro propio programa de navegación, el parámetro ppDisp debe establecerse en el objeto Aplicación
. En este momento, si selecciona "Abrir en una ventana nueva", se generará una nueva ventana para mostrar la página web. También puede configurar RegisterAsBrowser en TRUE, lo que hará que el control WebBrowser recién generado participe en el conflicto de nombres de ventanas. Por ejemplo, si el nombre de una ventana se usa en otra parte del script, entonces se usa el control en lugar de crear una nueva ventana, porque el control verifica todas las ventanas existentes antes de abrir una nueva ventana para evitar conflictos de nombres.
En el ejemplo de este artículo, como respuesta al evento, creamos dinámicamente una página de pestañas y generamos un control WebBrowser como su control secundario llamando al método CreateNewWebBrowser() - aquí cada control secundario Hay una propiedad de etiqueta que contiene información sobre el control.
Consulte el código fuente a continuación para obtener más detalles:
private void axWebBrowser1_NewWindow2(object sender, AxSHDocVw.DWebBrowserEvents2_NewWindow2Event e)
{
AxSHDocVw.AxWebBrowser _axWebBrowser = CreateNewWebBrowser() ;
e.ppDisp = _axWebBrowser.Application
_axWebBrowser.RegisterAsBrowser = true;
}
privado AxSHDocVw.AxWebBrowser CreateNewWebBrowser( )
{
AxSHDocVw.AxWebBrowser _axWebBrowser = nuevo AxSHDocVw.AxWebBrowser();
_axWebBrowser.Tag = nuevo HE_WebBrowserTag();
TabPage _TabPage = new TabPage();
_TabPage.Controls.Add(_axWebBrowser);
_axWebBrowser.Dock = DockStyle.Fill;
_axWebBrowser.BeforeNavigate2
p>= new
AxSHDocVw.DWebBrowserEvents2_BeforeNavigate2EventHandler(this.axWebBrowser1_BeforeNavigate2);
_axWebBrowser.DocumentComplete = new
AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler( this.axWebBrow ser1_DocumentComplete) ;
_axWebBrowser.NavigateComplete2 = nuevo
AxSHDocVw.DWebBrowserEvents2_NavigateComplete2EventHandler(this.axWebBrowser1_NavigateComplete2);
_axWebBrowser.NavigateError = nuevo AxSHDocV w.DWebBrowserEvents2_NavigateErrorEventHandler ( this.axWebBrowser1_NavigateError);
_axWebBrowser.NewWindow2 = nuevo AxSHDocVw.DWebBrowserEvents2_NewWindow2EventHandler(this.axWebBrowser1_NewWindow2);
_axWebBrowser.ProgressChange
= nuevo
AxSHDocVw.DWebBrowserEvents2
_ProgressChangeEventHandler(this.axWebBrowser1_ProgressChange);
_axWebBrowser.StatusTextChange = nuevo
AxSHDocVw.DWebBrowserEvents2_StatusTextChangeEventHandler(this.axWebBrowser1_StatusTextChange);
_axWebBrowser.TitleChange = nuevo A x SHDocVw. DWebBrowserEvents2_TitleChangeEventHandler (this.axWebBrowser1_TitleChange);
_axWebBrowser.CommandStateChange
= nuevo
AxSHDocVw.DWebBrowserEvents2_CommandStateChangeEventHandler(this.axWebBrowser1_CommandStateChange); p>
pestañaControl1 TabPages.Add(_TabPage);
tabControl1.SelectedTab = _TabPage;
return _axWebBrowser
} Tenga en cuenta que cada control WebBrowser tiene una etiqueta que definí. Como clase simple, se utiliza para contener información única relacionada con el control. Consulte:
clase pública HE_WebBrowserTag
{
public int _TabIndex = 0
public bool _CanBack = false
public bool _CanForward = false;
}
Implementar funciones como "Buscar", "Ver archivo fuente de la página", cuadro de diálogo "Opciones", etc. p>
Tenga en cuenta que esta rutina utiliza un GUID no documentado, que puede cambiar en sistemas futuros.
1. Defina la interfaz IOleCommandTarget
Para definir una interfaz .NET para obtener una referencia para una interfaz COM, siga los siguientes pasos:
1) Asigne el valor GUID de la interfaz COM correspondiente a la interfaz .NET;
2) Contiene declaraciones de tipo para todos los métodos en la interfaz
3) Contiene referencias a los archivos Mshtml.dll y Shdocvw.dll; , cuando opere en un proyecto de Visual C .NET, siga:
A. Haga clic en "Agregar referencia" en el menú del proyecto
B. /p>
C. Haga doble clic en "Biblioteca de objetos HTML de Microsoft" y "Controles de Internet de Microsoft".
4) La siguiente declaración de interfaz debe incluirse antes de la declaración del espacio de nombres del programa para agregar una referencia a la interfaz IOleCommandTarget de Microsoft HTML (MSHTML):
using System
usando System.Runtime.InteropServices
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
estructura pública OLECMDTEXT
{< / p>
public uint cmdtextf;
public uint cwActual;
public uint cwBuf;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=100) ] public char rgwz
}
[StructLayout(LayoutKind.Sequential)]
estructura pública OLECMD
{
public uint cmdID;
public uint cmdf;
}
// Definición de interoperabilidad de IOleCommandTarget
[ComImport, p>
Guid("b722bccb-4e68-101b-a2bc-00aa00404770"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interfaz pública IOleCommandTarget
{
//Importante: El orden de los siguientes métodos es muy importante porque en este ejemplo utilizamos el enlace temprano. Para obtener más información, consulte la referencia para la interoperabilidad de .NET/COM en MSDN.
void QueryStatus(ref Guid pguidCmdGroup, UInt32 cCmds,
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] OLECMD[] prgCmds, ref OLECMDTEXT CmdText);
void Exec(ref Guid pguidCmdGroup, uint nCmdId, uint nCmdExecOpt, ref object pvaIn, ref object pvaOut);
}
2. >
El GUID de CGI_IWebBrowser debe definirse para indicarle a MSHTML cómo manejar su ID de comando.
La implementación en .NET es la siguiente:
private Guid cmdGuid = new Guid("ED016940-BD5B-11CF-BA4E-00C04FD70816");
private enum MiscCommandTarget { Find = 1 , ViewSource, Opciones }
3. Llame al método Exec()
Tenga en cuenta que el requisito previo para que los siguientes tres procesos llamen exitosamente a Exec() es que el control del navegador llamado webBrowser ya existe.
mshtml.HTMLDocument privado GetDocument()
{
probar
{
mshtml.HTMLDocument htm = (mshtml.HTMLDocument)axWebBrowser2.Document;
return htm;
}
catch
{
throw (new Exception("No se puede obtener el objeto de archivo del control WebBrowser"));
}
}
//Método para ver el código fuente
public void ViewSource()
{
IOleCommandTarget cmdt;
Objeto o = nuevo objeto();
intenta
{
cmdt = (IOleCommandTarget)GetDocument();
cmdt.Exec(ref cmdGuid, (uint)MiscCommandTarget.ViewSource,
(uint)SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, ref o, ref o);
}
catch(Exception e)
{
System.Windows.Forms.MessageBox.Show(e.Message);
}
}
public void Find()
{
IOleCommandTarget cmdt;
Objeto o = nuevo objeto();
intentar
{
cmdt = (IOleCommandTarget)GetDocument();
cmdt.Exec(ref cmdGuid, (uint)MiscCommandTarget.Find,
(uint)SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, ref o , ref o);
}
catch(Exception e)
{
System.Windows.Forms.MessageBox.Show( e.Message);
}
}
//Método para mostrar el cuadro de diálogo "Opciones"
public void InternetOptions( )
{
IOleCommandTarget cmdt;
Objeto o = nuevo objeto();
intentar
{
cmdt = (IOleCommandTarget)GetDocument();
cmdt.Exec(ref cmdGuid, (uint)MiscCommandTarget.Options,
(uint)SHDocVw.OLECMD
EXECOPT.OLECMDEXECOPT_DODEFAULT, ref o, ref o);
}
catch
{
// Nota: Porque el proceso corresponde El CMDID se maneja en Internet Explorer
//, por lo que el bloque de código de excepción aquí siempre estará activado, incluso si el diálogo y su operación tienen éxito.
//Por supuesto, puedes desactivar este error seleccionando la configuración en tu navegador.
//Sin embargo, incluso si aparece este mensaje, no causará ningún daño a su host.
}
}
3
Resumen
Este artículo presenta en detalle cómo implementar un El básico Principios de los programas de navegación de varias páginas. Se aceptan críticas y correcciones de colegas. Además, el programa fuente adjunto a este artículo se ha depurado en la plataforma Windows 2000/.Net 2003/Internet Explorer 6.