【问题标题】:Calling Windows10 Calculator on a Java Process?在 Java 进程上调用 Windows10 计算器?
【发布时间】:2019-02-24 04:22:02
【问题描述】:

我是一名刚开始学习基于Java的多线程编程的学生。

作为我的第一个练习之一,有人告诉我创建一个执行 Windows 计算器的进程,然后等到该进程完成,然后发送一条消息。这是我所做的代码的摘录。

Process p = Runtime.getRuntime().exec("calc.exe");
p.waitFor();
System.out.println("Process finished");

当我执行它时,Windows 10 计算器打开,然后我收到 “进程完成” 消息。我不知道为什么在进程仍在运行时收到消息,因为计算器已打开,所以我尝试运行完全相同的代码,但使用 "notepad.exe" 作为命令执行。

这一次执行的结果是预期的:直到我关闭记事本才收到消息。

我尝试打开其他 Windows 10 默认程序,如 "explorer.exe",其中一些以应有的方式运行,而另一些则没有。

我对它的工作方式的想法"explorer.exe""calc.exe" 像某种启动器一样工作,因此当他们收到执行它们的进程时,他们会创建自己的进程,我无法使用 Java 程序控制这些进程。这是我完全猜测

实际问题是:为什么会这样? Windows 10 计算器和其他程序在进程方面是如何工作的?

提前致谢。

【问题讨论】:

    标签: java windows process


    【解决方案1】:

    Process#waitFor()返回int值,实际上是进程的退出码(即errorlevel)。

    如果启动的进程返回非零 errorlevel 并且在其他情况下“正确”(即按预期)工作,您的代码将失败。您可以通过运行下面的批处理文件来检查它:

    @echo off
    calc.exe
    REM explorer.exe
    echo Error level: %errorlevel%
    

    calc.exeexplorer.exe 会在您的环境中返回非零 errorlevel 输出,notepad.exe 会返回0

    在我的环境 (Windows 7) calc.exe 也返回 0 并且您的代码 sn-p 按预期工作。

    另外请注意,某些程序可能会在成功的情况下返回非零退出代码 - 这不是严格的。


    基于这一点以及第一个练习不应该太复杂的事实 - 假设您的代码 sn-p 就是答案。

    如果无论如何你仍然需要找到解决方案,你可以这样做(这里是批处理命令,而不是 Java):

    1. 运行calc.exe

      calc.exe

    2. 查找calc.exe进程的PID

      tasklist /v /fo csv | findstr /i "calc.exe"

    3. 当进程不再出现时,通过 PID 使用break; 对进程进行无限检查,例如使用命令(假设PID = 1111):

      tasklist /fi "pid eq 1111"

    【讨论】:

      猜你喜欢
      • 2017-12-12
      • 2016-07-04
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多