2012-12-30 11 views
5

In meiner Java-Anwendung verwende ichWarum schließt meine Java-Anwendung erfolgreich den Windows Explorer, kann ihn aber nicht erneut starten?

Runtime.getRuntime().exec("taskkill /F /IM " + explorer.exe).waitFor(); 

Windows Explorer zu schließen. Dieser Teil funktioniert, weil Explorer wirklich nicht mehr für mich arbeitet.

Leider, wenn ich

Runtime.getRuntime().exec("explorer.exe"); 

Windows Explorer neu starten, überhaupt nicht zu. Wie sollte ich es richtig neu starten?

+9

Killing Explorer ist extrem ärgerlich. Warum willst du das machen? – SLaks

+0

Weil ich eine Anmeldung machen möchte, die vom Benutzer nicht ignoriert werden kann. Wenn der Explorer läuft, ist es einfach, die Windows-Taste auf der Tastatur zu verwenden. – tb96

+2

Töten Explorer ist der falsche Weg, das zu tun. Es gibt Möglichkeiten, das zu tun, was tatsächlich funktioniert, aber Sie können sie in Java nicht wirklich tun. – SLaks

Antwort

1

Ich weiß nicht den Grund, warum das nicht für Sie funktioniert, da Sie ein externes Programm von Java ausführen, denke ich, es ist nicht Javas Fehler, dass es nicht neu startet, vielleicht ist etwas falsch in der Art und Weise Sie starten neu. Ich werde Ihnen eine Alternative geben:

Statt Runtime.exec() zu verwenden, versuchen ProcessBuilder.start() den Prozess zum Starten und die Methode destroy() aus der Klasse verwenden Process den Prozess zu töten. Es sollte in Ordnung funktionieren, verwenden Sie einfach den Builder, um ein Objekt zu erstellen, das den Explorer darstellt, und weisen Sie ihn einer Variablen vom Typ Process zu.

Der einzige Grund, warum ich denke, dass es einfacher ist, wenn Sie den ProcessBuilder verwenden, ist, weil es Argumente als separate Strings akzeptiert, und das macht es vielleicht einfacher, Ihre Skripte zu konfigurieren.

Beispiel:

List<String> params = java.util.Arrays.asList("C:\myProgram.exe", "-arg1", "-arg2"); 
ProcessBuilder pb = new ProcessBuilder(params); 
Process process = pb.start(); 

Versuchen Sie es einmal ich denke, es sollte funktionieren.

0

Ich denke, das Problem liegt darin, dass Sie eine neue Laufzeitumgebung nicht abrufen können, nachdem Sie [explorer.exe] beendet haben. Für mich funktionierte es, die Laufzeitumgebung, die ich zum Beenden von [explorer.exe] verwendet habe, wiederzuverwenden. Ich fand das nützlich, um bestimmte Systemressourcen innerhalb von Java (TM) bearbeiten zu können.

public class KillRestart { 
    public static void main (String [] args) { 
     Runtime runtime = Runtime.getRuntime(); 

     try { 
     System.out.println ("Killing Explorer.exe process ... "); 
     runtime.exec ("taskkill /F /IM explorer.exe /T").waitFor(); 

     // Do something wild like update system resources 

     System.out.println ("Resurrecting Explorer ..."); 
     runtime.exec ("explorer.exe"); 
     } 
     catch (InterruptedException e) { 
     e.printStackTrace(); 
     } 
     catch (IOException e) { 
     e.printStackTrace(); 
     } 
    } 
}