【问题标题】:Why does my Java application successfully close Windows Explorer, but fail to restart it again?为什么我的 Java 应用程序成功关闭 Windows 资源管理器,但无法再次重新启动它?
【发布时间】:2012-12-15 02:27:33
【问题描述】:

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

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

关闭 Windows 资源管理器。这部分有效,因为 Explorer 真的不再为我工作了。

不幸的是,当我使用

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

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

【问题讨论】:

  • 杀死资源管理器非常烦人。你为什么要这么做?
  • 因为我想做一个用户无法忽略的登录。如果资源管理器继续运行,则可以轻松使用键盘上的 windows 按钮。
  • 杀死 explorer 是错误的做法。有一些方法可以做到真正有效,但你不能在 Java 中真正做到。
  • 此应用程序仅供个人使用。如果有人认为这很烦人,我真的不介意。我的问题没有真正的答案。
  • 将 explorer.exe 所在的正确路径传递给它

标签: java windows-7 windows-explorer kill-process


【解决方案1】:

我不知道这对你不起作用的原因,因为你正在从 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(); 

试一试,我认为应该可以。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

         //java program
         ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "powershell","Stop-Process - 
         ProcessName explorer -Force");
         Process p = pb.start();
       
      

      【讨论】:

        猜你喜欢
        • 2019-12-03
        • 2013-03-12
        • 2011-03-04
        • 2013-02-25
        • 1970-01-01
        • 2020-05-19
        • 2019-08-03
        • 1970-01-01
        相关资源
        最近更新 更多