2009-12-01 4 views
9

J'ai un problème étrange avec IE8 installé dans XP. J'essayais de lancer IE en utilisant une méthode System.Diagnostics.Process.Start en C#. Et j'ai une exigence pour piéger l'événement exité de l'IE et faire une opération. Mais je me suis retrouvé dans un problème assez étrange où l'IE déclenche immédiatement l'événement sorti après le lancement.Process.Start ("IEXPLORE.EXE") déclenche immédiatement l'événement Exited après le lancement .. pourquoi?

c'est l'exemple de code

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

Mais le code ci-dessus fonctionne parfaitement lorsque laucnching processus différent (ex: bloc-notes) et il déclenche l'événement de sortie lorsque je ferme l'exe.

cela ne fait que lancer le problème IE 8. Quelqu'un peut-il me préciser quel est le problème ??

MISE À JOUR

La plupart des amis ont répondu mon message et dire pourquoi vous ne pouvez pas utiliser une URL? pourquoi rester avec IE?

ici la raison

le but ultime de l'application est de lancer une URL de l'application Windows et cachera un exe lorsque vous travaillez sur l'IE. Et montrez l'exe après avoir fermé l'IE.

Merci

+0

sur mon système (XP SP 3, .NET Framework 3.5, IE 8) ce code fonctionne sans aucun problème. Peut-être que vous avez un problème de permission? – Jehof

+0

avez-vous essayé avec d'autres fenêtres IE déjà ouvertes ?? – RameshVel

+1

Notez que les utilisateurs avec un navigateur par défaut différent n'apprécieront pas que vous ouvrez IE. Vous pouvez simplement passer l'URL à 'Process.Start', mais assurez-vous que' UseShellExecute' est activé. Bien sûr, cela complique la vérification si le navigateur est sorti ... – Thomas

Répondre

18

Le plus probable est que vous avez déjà IE en cours d'exécution, donc lorsque vous essayez de le lancer à nouveau comme un nouveau processus, il semble que IE fonctionne déjà, lui dit que l'utilisateur a initié une nouvelle fenêtre IE va créer une "nouvelle" fenêtre plutôt qu'une nouvelle) et quitter.

solution possible: essayer de lancer le processus de "-nomerge" Option de ligne de commande:

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

observation intéressante: objProcess.ExitCode (pour IE8 au moins) sera égal à 0 si sorti passage contrôle à une autre instance, et 1 si elle a été fermée par l'utilisateur.

+0

merci beaucoup pour la réponse Regent. votre approche me permet de gérer la sortie IE à la fermeture. Mais maintenant l'URL est totalement foiré et affiche quelque chose comme ceci "http: /// new% 20http: //google.com/" et ne pas charger le document attendu ... – RameshVel

+0

Essayez "-new http: // google. com/"s'il vous plaît. – Regent

+0

en lançant l'URL. Mais ne fonctionne pas comme prévu :(.. cela conduit au comportement par défaut. (Tir sortant après le lancement) – RameshVel

1

Peut-être lui-même IEXPLORE lance un processus différent pour l'URL et se termine le processus que vous avez créé? Comme un fork sur Unix?

+0

Quelque chose de ceci est également venu à mon esprit ... que iexplore.exe est réellement coup de pied d'autre chose ou en créant un autre processus pour le programme principal. – Bobby

3

Si une autre instance de iexplore.exe est déjà en cours d'exécution sur la machine, de nouvelles instances s'y connecteront et se fermeront immédiatement. En outre, il est possible que même dans le cas où iexplore n'est pas en cours d'exécution, le multiprocess architecture d'Internet Explorer 8 lance le processus parent enfant et quitte immédiatement.

Mais ces réponses sont d'ailleurs le point. Vous ne devriez pas lancer Internet Explorer directement. Si l'utilisateur a configuré un autre navigateur par défaut, il sera mécontent que vous ignoriez ses préférences. Au lieu de cela, pourquoi ne pas essayer

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

directement et cela fera la bonne chose. Vous ne serez pas en mesure de dire quand le navigateur a fermé, mais si la commande a ouvert un nouvel onglet dans une session de navigateur existante par exemple, l'événement de fermeture du navigateur n'aura aucun sens pour votre application.

Questions connexes