2009-12-01 22 views
9

tengo un problema extraño con IE8 instalado en xp. Estaba intentando lanzar IE usando un método System.Diagnostics.Process.Start en C#. Y tengo un requisito para atrapar el evento salido del IE y hacer alguna operación. Pero terminé en un problema bastante extraño en el que el IE inmediatamente dispara el evento salido después del lanzamiento.Process.Start ("IEXPLORE.EXE") inmediatamente activa el evento Exited después del lanzamiento ... ¿por qué?

este es el código de ejemplo

 Process objProcess = Process.Start("IEXPLORE.EXE", "http://google.com"); 

    if (objProcess != null) 
    { 
     objProcess.EnableRaisingEvents = true; 
     objProcess.Exited += new EventHandler(myProcess_Exited);   
    } 

    public static void myProcess_Exited(object sender, System.EventArgs e) 
    { 
     MessageBox.Show("You exited"); 
    } 

Pero el código anterior funciona perfectamente cuando laucnching proceso diferente (por ejemplo: bloc de notas) y se dispara el evento de salida cuando cierro el exe.

esto solo da problemas para iniciar IE 8. ¿Alguien me puede aclarar cuál es el problema?

ACTUALIZACIÓN

La mayoría de los amigos respondieron mi post y decir por qué no puede simplemente utilizar una URL? ¿Por qué quedarse con IE?

aquí la razón

el objetivo último de la aplicación es poner en marcha una dirección URL de la aplicación de Windows y se esconderá un exe cuando se trabaja en el IE. Y muestra el exe después de cerrar el IE.

Gracias

+0

en mi sistema (XP SP 3, .NET Framework 3.5, IE 8) este código funciona sin ningún problema. Tal vez tienes un problema de permiso? – Jehof

+0

¿lo intentó con otra ventana de IE ya abierta? – RameshVel

+1

Tenga en cuenta que los usuarios con un navegador predeterminado diferente no apreciarán que abra IE. Puede intentar simplemente pasar la URL a 'Process.Start', pero asegúrese de que' UseShellExecute' esté configurado. Por supuesto, esto complica la comprobación de si el navegador salió ... – Thomas

Respuesta

18

Lo más probable es que ya tenga IE ejecutándose como un proceso, por lo que cuando intente iniciarlo de nuevo como un nuevo proceso parece que IE ya está ejecutándose, le dice que el usuario inició una nueva ventana (por lo que IE creará una "nueva" ventana en lugar de una nueva) y saldrá.

Posible solución: intente iniciar el proceso con "-nomerge" opción de línea de comando:

Process objProcess = Process.Start("IEXPLORE.EXE", "-nomerge http://google.com/"); 

observación interesante: objProcess.ExitCode (por IE8 al menos) será igual a 0 si salido de paso controlar a otra instancia, y 1 si fue realmente cerrado por el usuario.

+0

muchas gracias por la respuesta Regent. su enfoque me permite manejar la salida de IE al cerrar. Pero ahora la URL está totalmente desordenada y muestra algo así como "http: /// new% 20http: //google.com/" y no carga el documento esperado ... – RameshVel

+0

Pruebe "-new http: // google. com/"por favor. – Regent

+0

lanzando la URL. Pero no funciona como se esperaba :(... esto lleva al comportamiento predeterminado. (Disparando salió después del lanzamiento) – RameshVel

1

Tal vez sí IEXPLORE pone en marcha un proceso diferente para la URL y finaliza el proceso que ha creado? Como un fork en Unix?

+0

Algo de esto también me vino a la mente ... que iexplore.exe en realidad está pateando algo más o está creando otro proceso para el programa principal. – Bobby

3

Si otra instancia de iexplore.exe ya se está ejecutando en la máquina, se conectarán nuevas instancias e inmediatamente se cerrarán. Además, es posible que incluso en el caso en que iexplore no se esté ejecutando, el multiprocess architecture de Internet Explorer 8 tenga el proceso principal de lanzamiento del agente secundario y salga inmediatamente.

Pero estas respuestas son además del punto. No debería iniciar Internet Explorer directamente. Si el usuario ha configurado otro navegador predeterminado, no estará contento de que esté ignorando sus preferencias. En su lugar, ¿por qué no prueba

System.Diagnostics.Process.Start("http://google.com"); 

directamente y eso hará lo correcto. No podrá saber cuándo se cerró el navegador, pero si el comando abrió una nueva pestaña en una sesión del navegador existente, por ejemplo, el evento de cierre del navegador no tendrá sentido para su aplicación.

Cuestiones relacionadas