72 votes

Comment tuer un processus en utilisant Vb.NET ou C# ?

J'ai un scénario dans lequel je dois vérifier si l'utilisateur a déjà ouvert Microsoft Word. Si c'est le cas, je dois tuer le processus winword.exe et continuer à exécuter mon code.

Est-ce que quelqu'un a un code simple pour tuer un processus en utilisant vb.net ou c# ?

98voto

Blair Conrad Points 56195

Vous voudrez utiliser le System.Diagnostics.Process.Kill méthode. Vous pouvez obtenir le processus que vous souhaitez en utilisant System.Diagnostics.Processus.GetProcessesByName .

Des exemples ont déjà été postés ici, mais j'ai trouvé que la version non.exe fonctionnait mieux, donc quelque chose comme :

foreach ( Process p in System.Diagnostics.Process.GetProcessesByName("winword") )
{
    try
    {
        p.Kill();
        p.WaitForExit(); // possibly with a timeout
    }
    catch ( Win32Exception winException )
    {
        // process was terminating or can't be terminated - deal with it
    }
    catch ( InvalidOperationException invalidException )
    {
        // process has already exited - might be able to let this one go
     }
}

Vous n'avez probablement pas à faire face à NotSupportedException ce qui suggère que le processus est distant.

0 votes

Il ne fonctionne pas non plus dans de nombreux autres cas. (si le processus s'est protégé avec des ACLs, par exemple) - en fait meurtre un processus est une idée horrible et ne fera que générer des problèmes à long terme. Les processus doivent toujours être fermé au lieu de les tuer pour qu'ils puissent s'arrêter correctement. Cette réponse est une erreur typique des débutants.

29voto

mdb Points 20629

Tuer carrément le processus Word est possible (voir certaines des autres réponses), mais carrément grossier et dangereux : que faire si l'utilisateur a des modifications importantes non sauvegardées dans un document ouvert ? Sans parler des fichiers temporaires périmés que cela laissera derrière lui...

C'est probablement le maximum que vous puissiez faire à cet égard (VB.NET) :

    Dim proc = Process.GetProcessesByName("winword")
    For i As Integer = 0 To proc.Count - 1
        proc(i).CloseMainWindow()
    Next i

Cela fermera toutes les fenêtres Word ouvertes de manière ordonnée (en invitant l'utilisateur à enregistrer son travail, le cas échéant). Bien sûr, l'utilisateur peut toujours cliquer sur "Annuler" dans ce scénario, vous devriez donc être en mesure de gérer ce cas également (de préférence en affichant une boîte de dialogue "Veuillez fermer toutes les instances de Word, sinon nous ne pourrons pas continuer"...).

0 votes

Je suis d'accord avec cette approche. L'arrêt d'un processus devrait être le dernier recours possible. Il pourrait y avoir des conséquences involontaires.

15voto

Nick Berardi Points 31361

Voici un exemple simple de la façon de tuer tous les processus Word.

Process[] procs = Process.GetProcessesByName("winword");

foreach (Process proc in procs)
    proc.Kill();

1 votes

Un commentaire - utilisez "winword" au lieu de "winword.exe".

5voto

Vova Popov Points 621
    public bool FindAndKillProcess(string name)
    {
        //here we're going to get a list of all running processes on
        //the computer
        foreach (Process clsProcess in Process.GetProcesses()) {
            //now we're going to see if any of the running processes
            //match the currently running processes by using the StartsWith Method,
            //this prevents us from incluing the .EXE for the process we're looking for.
            //. Be sure to not
            //add the .exe to the name you provide, i.e: NOTEPAD,
            //not NOTEPAD.EXE or false is always returned even if
            //notepad is running
            if (clsProcess.ProcessName.StartsWith(name))
            {
                //since we found the proccess we now need to use the
                //Kill Method to kill the process. Remember, if you have
                //the process running more than once, say IE open 4
                //times the loop thr way it is now will close all 4,
                //if you want it to just close the first one it finds
                //then add a return; after the Kill
                try 
                {
                    clsProcess.Kill();
                }
                catch
                {
                    return false;
                }
                //process killed, return true
                return true;
            }
        }
        //process not found, return false
        return false;
    }

5voto

Chris Lawlor Points 10033

Vous pouvez contourner les problèmes de sécurité et créer une application beaucoup plus polie en vérifiant simplement si le processus Word est en cours d'exécution, en demandant à l'utilisateur de le fermer, puis en cliquant sur un bouton "Continuer" dans votre application. C'est l'approche adoptée par de nombreux installateurs.

private bool isWordRunning() 
{
    return System.Diagnostics.Process.GetProcessesByName("winword").Length > 0;
}

Bien sûr, vous ne pouvez le faire que si votre application a une interface graphique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X