web-dev-qa-db-fra.com

vérifier si un programme exe est en cours d'exécution sur les fenêtres

Comment vérifier si un programme .exe est en cours d'exécution sur Windows? 

Je crée une application Java qui met à jour un programme .exe. Donc, si ce programme exe est utilisé par un client, mon application demande la fermeture du programme exe, et après la fermeture remplace automatiquement le fichier .exe par le nouveau.

12
duka.milan

Vous pouvez exécuter l'instruction suivante dans votre programme Java. Avant cela, vous devez connaître le nom de la tâche dans task manager. Supposons que vous souhaitiez voir MS-Word s'exécuter. Ensuite, lancez MS-Word, allez dans le gestionnaire de tâches et sous l’onglet Processus, vous devriez voir un processus nommé Word.exe. Déterminez le nom du processus que vous ciblez. Une fois que vous avez cela, vous venez d'exécuter le code suivant:

String line;
String pidInfo ="";

Process p =Runtime.getRuntime().exec(System.getenv("windir") +"\\system32\\"+"tasklist.exe");

BufferedReader input =  new BufferedReader(new InputStreamReader(p.getInputStream()));

while ((line = input.readLine()) != null) {
    pidInfo+=line; 
}

input.close();

if(pidInfo.contains("your process name"))
{
    // do what you want
}
31
Aneesh

Vous pouvez essayer d'exécuter le code suivant:

Runtime rt = Runtime.getRuntime();

et exécuter "tasklist"

tasklist renvoie la liste des processus en cours d'exécution (comme indiqué dans l'onglet de processus du gestionnaire de tâches). 

3
TheLostMind

Voici un code complet pour vérifier si une application est en cours d'exécution sur un système Windows ou non:

import Java.awt.*;
import Java.io.File;
import Java.io.IOException;
import Java.io.InputStream;
import Java.util.Scanner;

public class ApplicationUtilities
{
    public static void runApplication(String applicationFilePath) throws IOException, InterruptedException
    {
        File application = new File(applicationFilePath);
        String applicationName = application.getName();

        if (!isProcessRunning(applicationName))
        {
            Desktop.getDesktop().open(application);
        }
    }

    // http://stackoverflow.com/a/19005828/3764804
    private static boolean isProcessRunning(String processName) throws IOException, InterruptedException
    {
        ProcessBuilder processBuilder = new ProcessBuilder("tasklist.exe");
        Process process = processBuilder.start();
        String tasksList = toString(process.getInputStream());

        return tasksList.contains(processName);
    }

    // http://stackoverflow.com/a/5445161/3764804
    private static String toString(InputStream inputStream)
    {
        Scanner scanner = new Scanner(inputStream, "UTF-8").useDelimiter("\\A");
        String string = scanner.hasNext() ? scanner.next() : "";
        scanner.close();

        return string;
    }
}

Par exemple, vous pouvez utiliser la méthode runApplication() pour exécuter l'application uniquement lorsqu'elle n'est pas encore en cours d'exécution:

ApplicationUtilities.runApplication("C:\\Program Files (x86)\\WinSCP\\WinSCP.exe");

Le même principe s'applique pour la suppression de l'exécutable.

1
BullyWiiPlaza

Juste une suggestion pour les utilisateurs de Java 9 ou supérieur.
Il est même indépendant du système d'exploitation:

Interface ProcessHandle
static Stream<ProcessHandle>    allProcesses​()

Plus de détails sur:
https://docs.Oracle.com/javase/9/docs/api/Java/lang/ProcessHandle.html

0
Mr. Michael Eder