【问题标题】:check if some exe program is running on the windows检查某些 exe 程序是否在 windows 上运行
【发布时间】:2013-09-25 12:50:11
【问题描述】:

如何检查某些 .exe 程序是否在 Windows 上运行(正在处理)?

我正在制作更新一个 .exe 程序的 java 应用程序。因此,如果某个客户端使用该 exe 程序,我的应用程序会要求关闭 exe 程序,并在关闭后自动将 .exe 文件替换为新的。

【问题讨论】:

标签: java process exe


【解决方案1】:

您可以在您的 java 程序中运行以下语句。在此之前,您需要知道task manager 中的任务名称。假设您想查看 MS-Word 正在运行。然后运行 ​​MS-Word,进入任务管理器,在进程选项卡下,你应该会看到一个名为 word.exe 的进程。找出您所针对的进程的名称。一旦你有了它,你只需运行以下代码:

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
}

【讨论】:

  • 与其将所有行连接在一起,在while 循环中检查line.contains(processName) 可能会更有效。
  • 检查每一行是否包含(processName) 将花费更多时间然后在while 循环之后签入pidInfo
  • 任务列表返回所有正在运行的 exe。是否可以仅获取在前台运行的 exe 列表?
【解决方案2】:

这是检查应用程序是否在Windows 系统上运行的完整代码:

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://*.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://*.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;
    }
}

例如,您可以使用runApplication() 方法仅在应用程序尚未运行时才运行它:

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

同样的原则也适用于删除可执行文件。

【讨论】:

    【解决方案3】:

    您可以尝试运行以下代码:

    Runtime rt = Runtime.getRuntime();
    

    并执行“任务列表”

    tasklist 返回当前正在执行的进程的列表(如任务管理器的进程选项卡中所示)。

    【讨论】:

    • 感谢 TheLostMind 这是非常简单的方法。
    【解决方案4】:

    只是对 Java 9 或更高版本的用户的建议。
    它甚至独立于操作系统:

    Interface ProcessHandle
    static Stream<ProcessHandle>    allProcesses​()
    

    更多详情请访问:
    @987654321@

    【讨论】:

      最近更新 更多