Wie kann man überprüfen, ob ein .exe-Programm unter Windows läuft (ausgeführt wird)?
Ich mache Java-Anwendung, die ein .exe-Programm aktualisiert. Wenn also dieses Exe-Programm von einem Client verwendet wird, fordert meine Anwendung zum Beenden des Exe-Programms auf und ersetzt nach dem Schließen automatisch die .exe-Datei durch eine neue.
Sie können die folgende Anweisung in Ihrem Java-Programm ausführen. Zuvor müssen Sie den Namen der Aufgabe in task manager
kennen. Angenommen, Sie möchten sehen, dass MS-Word ausgeführt wird. Führen Sie dann MS-Word aus, wechseln Sie zum Task-Manager und unter der Registerkarte "Prozess" sollte ein Prozess mit dem Namen "Word.exe
" angezeigt werden. Ermitteln Sie den Namen des Prozesses, auf den Sie abzielen. Sobald Sie das haben, führen Sie einfach den folgenden Code aus:
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
}
Sie können versuchen, den folgenden Code auszuführen:
Runtime rt = Runtime.getRuntime();
und "tasklist" ausführen
tasklist gibt eine Liste der aktuell ausgeführten Prozesse zurück (wie auf der Prozessregisterkarte des Task Managers angezeigt).
Hier ist ein vollständiger Code zum Überprüfen, ob eine Anwendung auf einem Windows
-System ausgeführt wird oder nicht:
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;
}
}
Beispielsweise können Sie die runApplication()
-Methode verwenden, um die Anwendung nur auszuführen, wenn sie noch nicht ausgeführt wird:
ApplicationUtilities.runApplication("C:\\Program Files (x86)\\WinSCP\\WinSCP.exe");
Dasselbe Prinzip gilt für das Löschen der ausführbaren Datei.
Nur ein Vorschlag für Benutzer von Java 9 oder höher.
Es ist sogar betriebssystemunabhängig:
Interface ProcessHandle
static Stream<ProcessHandle> allProcesses()
Weitere Details unter:https://docs.Oracle.com/javase/9/docs/api/Java/lang/ProcessHandle.html