2013-09-25 31 views
7

Jak sprawdzić, czy jakiś program .exe działa (jest w trakcie) w systemie Windows?Sprawdź, czy jakiś program exe jest uruchomiony w oknach

Tworzę aplikację java, która aktualizuje jeden program .exe. Tak więc, jeśli ten program exe jest używany przez jakiegoś klienta, moja aplikacja prosi o zamknięcie programu exe, a po zamknięciu automatycznie zastępuje plik .exe nowym.

+1

sprawdź to pytanie: [Jak uzyskać listę aktualnych otwartych okien/procesów z Javą?] (Http://stackoverflow.com/questions/54686/how-to-get-a-list-of-current- open-windows-process-with-java) – Renan

+0

Pytania dotyczące ogólnych obliczeń są nie na temat w Stack Overflow. Proponuję spróbować szczęścia na [Superużytkowniku] (http://superuser.com) –

Odpowiedz

23

Możesz uruchomić następującą instrukcję w swoim programie java. Przed tym musisz znać nazwę zadania w task manager. Powiedzmy, że chcesz zobaczyć MS-Word działa. Następnie uruchom MS-Word, przejdź do menedżera zadań i na karcie procesu powinieneś zobaczyć proces o nazwie word.exe. Znajdź nazwę procesu, na który kierujesz reklamy. Kiedy już, że, po prostu uruchom następujący kod:

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 
} 
+2

+1, aby uzyskać pełny kod: P – TheLostMind

+0

Dzięki Tharindu Rusira, która pomogła mi rozwiązać problem! –

+0

Zamiast łączyć ze sobą wszystkie linie, prawdopodobnie bardziej wydajnie byłoby sprawdzić 'line.contains (processName)' wewnątrz pętli 'while'. – 4castle

3

U można spróbować wykonać następujące czynności:

Runtime rt = Runtime.getRuntime(); i wykonaj "listę zadań"

lista zadań zwraca listę aktualnie uruchomionych procesów (jak pokazano na karcie procesu menedżera zadań).

+0

Dzięki TheLostMind to bardzo proste podejście. –

1

Oto pełny kod do sprawdzania, czy aplikacja jest uruchomiona w systemie Windows czy nie:

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

Na przykład, można użyć metody runApplication() tylko uruchomić aplikację, kiedy nie jest jeszcze uruchomiony:

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

Ta sama zasada dotyczy kasowania pliku wykonywalnego.