IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Fermer un processus précis


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 13
    Par défaut Fermer un processus précis
    Bonjour à tous,
    Je suis en train de faire un projet pour mon stage et je suis un peu bloqué.
    Mon programme ouvre 4x iexplore et je cherche ensuite à fermer ces 4 fenêtres précisément.

    Voici mon ptit bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
              private void button1_Click(object sender, EventArgs e)
              {
                   prolink.StartInfo.FileName = "iexplore";
                   prolink.StartInfo.Arguments = linkurl;
                   prolink.Start();
     
                   profb.StartInfo.FileName = "iexplore";
                   profb.StartInfo.Arguments = fburl;
                   profb.Start();                    
     
                   protw.StartInfo.FileName = "iexplore";
                   protw.StartInfo.Arguments = twurl;
                   protw.Start();                             
     
                   pronet.StartInfo.FileName = "iexplore";
                   pronet.StartInfo.Arguments = neturl;
                   pronet.Start();
     
            private void button3_Click(object sender, EventArgs e)
            {
                   KillProcess("iexplore");
            }
     
     
            private void KillProcess(string processName)
            {
     
                  Process[] process = Process.GetProcessesByName(processName);
     
                  for (int i = 0; i < process.Length; i++)
                  {
                          Process.GetProcessById(process[i].Id).CloseMainWindow();
                  }
            }
    Lorsque je clic sur le bouton3 il ne me ferme qu'une seule fenetre (la dernière ouverte) je comprend pas pourquoi. Pourtant "process.Length" vaut bien 4.
    Donc il passe 3x dans le for sans rien faire et la 4eme fois il ferme une fenêtre.
    Je dois donc cliquer 4x sur le bouton3 pour fermer toutes les fenetres.

    En fait pour plus de précision je cherche le moyen de tuer le processus avec son ID unique. J'ai essayé de récupérer l'id des mes 4 fenêtres IE lors de leurs lancement avec par ex "prolink.Id" mais je ne trouve pas le moyen de faire le "CloseMainWindow()" d'une fenêtre avec son id.

    Si je remplace "CloseMainWindow()" par "Kill()", il me ferme tous les processus iexplore mais ça ne m'arrange pas parce que si j'ai ouvert des autres pages iexplore, ça les fermes tout alors que je ne veux que fermer les 4 ouvertes par le programme ...

    ça parait compliqué, j'espère que je n'ai pas été trop flou dans ma description.

    D'avance merci.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    L'astuce tient à récupérer les code des processus lancés, et ne traiter que ceux là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                List<int> codesProcess = new List<int>();
     
                prolink.StartInfo.FileName = "iexplore";
                prolink.StartInfo.Arguments = linkurl;
                codesProcess.Add(prolink.Start().Id); //Start renvoie une nouvelle instance de Process
     
                //Idem pour les autres process...
     
     
                //On tue
                foreach(int codeProcess in codesProcess)
                   System.Diagnostics.Process.GetProcessById(codeProcess).Kill();//CloseMainWindow ??

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 13
    Par défaut
    Tu es très clair dans ta réponse,merci, j'ai essayé ton code mais je n'arrive pas à mettre ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    codesProcess.Add(prolink.Start().Id);
    il me dit :
    'bool' ne contient pas une définition pour 'Id' et aucune méthode d'extension 'Id' acceptant un premier argument de type 'bool' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante?
    voici mes usings :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Diagnostics;
    using System.Net;
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Threading;
    J'ai donc essayé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      List<int> codesProcess = new List<int>(); 
     
       // processes
       prolink.StartInfo.FileName = "iexplore";
       prolink.StartInfo.Arguments = linkurl;
       prolink.Start();
       codesProcess.Add(prolink.Id);
     
     
       // kill
       foreach(int codeProcess in codesProcess)
       Process.GetProcessById(codeProcess).Kill();
    Mais sans succès

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Mélange entre la méthode statique (qui renvoie Process), et la méthode d'instance (qui renvoie bool), au temps pour moi !

    Que vaut prolink.Id après le start ?

    Edit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                int i = Process.Start("iexplore", "www.google.fr").Id;
     
                System.Threading.Thread.Sleep(5000);
     
                Process.GetProcessById(i).Kill();
     
                Process p2 = new Process();
                p2.StartInfo = new ProcessStartInfo() { FileName = "iexplore", Arguments = "www.google.fr" };
     
                p2.Start();
     
                System.Threading.Thread.Sleep(5000);
     
                p2.Kill();
    Les 2 process chez moi ouvrent et ferment ! Je te laisse tester

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 13
    Par défaut
    prolink.Id c'est un Int qui ne vaut jamais 2x la même chose (je suppose qu'il est normal que les processus n'ont pas tjs le même Id)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 13
    Par défaut
    En effet ton code ferme bien les 2 fenêtre IE ouvertes par lui-même 5 secondes plus tôt mais si tu ouvres manuellement une fenêtre IE avant de lancer le programme, ça plante. moi j'aurais voulu que les fenêtres qui ne sont pas ouvertes par le programme restent ouvertes.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Par défaut
    Citation Envoyé par Arnard Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                int i = Process.Start("iexplore", "www.google.fr").Id;
     
                System.Threading.Thread.Sleep(5000);
     
                Process.GetProcessById(i).Kill();
     
                Process p2 = new Process();
                p2.StartInfo = new ProcessStartInfo() { FileName = "iexplore", Arguments = "www.google.fr" };
     
                p2.Start();
     
                System.Threading.Thread.Sleep(5000);
     
                p2.Kill();
    Effectivement, ton code va fonctionner car tu n'as pas deux instances d'IE ouvertes par le même programme en même temps.
    Si tu fais un test avec les event Process.Exited et Process.Closed, tu te rendra compte que le process se ferme si tu en rouvres un autre.

    Le problème ne vient pas du code mais du browser.

    La solution c'est d'utiliser -noframemerging en paramètre lors de l'appel (et pour info ton code d'origine est sensé fonctionner sans autre avec ce paramètre supplémentaire).

    Pour ceux que ça intéresse, voici le lien de microsoft concernant IE :
    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

    Voila un petit exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    private List<Process> processesList = new List<Process>();
    private const String browser = "IExplore";
    private const String ieparameter = "-noframemerging";
     
    private void button1_Click(object sender, EventArgs e) {
    	String[] links = { linkurl, fburl, twurl, neturl };
    	foreach (String link in links) {
    		ProcessStartInfo psi = new ProcessStartInfo(browser, ieparameter + " " + link );
    		processesList.Add(Process.Start(psi));
    	}
    }
    private void button3_Click(object sender, EventArgs e)
    {
    	KillProcess();
    }
    private void KillProcess()
    {
    	foreach (Process p in processesList) {
    		p.CloseMainWindow();
    	}
    }

  8. #8
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Vive la feinte d'IE

    Merci pour l'info en tout cas ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fermer le processus d'un exe
    Par haco28 dans le forum Langage
    Réponses: 5
    Dernier message: 05/12/2007, 13h43
  2. fermer un processus Excel
    Par sophiesallee dans le forum VBA Access
    Réponses: 6
    Dernier message: 03/10/2007, 11h42
  3. Fermer un processus en C#
    Par hugobosscool26 dans le forum C#
    Réponses: 7
    Dernier message: 11/06/2007, 21h47
  4. comment fermer le processus excel sous iis
    Par dietrich dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 16/01/2007, 14h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo