为什么我的Java应用程序成功地关闭了Windows资源管理器,但又无法重新启动它?

为什么我的Java应用程序成功地关闭了Windows资源管理器,但又无法重新启动它?,java,windows-7,windows-explorer,kill-process,Java,Windows 7,Windows Explorer,Kill Process,在我的java应用程序中,我使用 Runtime.getRuntime().exec("taskkill /F /IM " + explorer.exe).waitFor(); 关闭Windows资源管理器。这部分工作,因为Explorer realy停止为我工作 不幸的是,当我使用 Runtime.getRuntime().exec("explorer.exe"); Windows资源管理器根本不会重新启动。我应该如何正确地重新启动它?我不知道这对您不起作用的原因,因为您正在从java执行

在我的java应用程序中,我使用

Runtime.getRuntime().exec("taskkill /F /IM " + explorer.exe).waitFor();
关闭Windows资源管理器。这部分工作,因为Explorer realy停止为我工作

不幸的是,当我使用

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

Windows资源管理器根本不会重新启动。我应该如何正确地重新启动它?

我不知道这对您不起作用的原因,因为您正在从java执行一个外部程序,我认为它没有重新启动不是java的错,也许重新启动的方式有问题。 我会给你一个选择:

不要使用
Runtime.exec()
,而是尝试
ProcessBuilder.start()
来启动进程并 使用类
Process
中的方法
destroy()
终止该进程。 它应该可以正常工作,只需使用生成器创建一个表示资源管理器的对象,并将其分配给类型为
Process
的变量即可

我认为如果使用ProcessBuilder可能会更容易,唯一的原因是它将参数作为单独的字符串,这可能会使配置脚本更容易

例如:

List<String> params = java.util.Arrays.asList("C:\myProgram.exe", "-arg1", "-arg2");
ProcessBuilder pb = new ProcessBuilder(params);
Process process = pb.start(); 
List params=java.util.Arrays.asList(“C:\myProgram.exe”、“-arg1”、“-arg2”);
ProcessBuilder pb=新的ProcessBuilder(参数);
Process进程=pb.start();

试试看,我认为它应该可以工作。

我认为问题在于,在您杀死[explorer.exe]之后,您无法检索新的运行时环境。对我有效的方法是重用我用来杀死[explorer.exe]的运行时环境。我发现这对于从Java(TM)中编辑某些系统资源非常有用


最后,我找到了一个适合我的方法,powershell命令“Stop Process”帮助我,该命令必须有“-force”参数


杀死探险家是非常烦人的。你为什么要这样做?因为我想让用户无法忽略我的登录。如果资源管理器继续运行,使用键盘上的windows按钮就很容易了。杀死资源管理器是错误的做法。有很多方法可以做到这一点,但在Java中却无法做到。这个应用程序仅供个人使用。如果有人认为这很烦人,我真的不介意。我的问题没有真正的答案。请将它传递给explorer.exe所在的正确路径
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 ();
      }
   }
}
   //java program
   ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "powershell","Stop-Process - 
   ProcessName explorer -Force");
   Process p = pb.start();