3

我正在开发一个基于 java 的桌面应用程序。一个要求是,如果应用程序正在运行并且用户尝试再次启动应用程序,它应该执行一些操作,例如显示一些警报等。

我为此使用了文件,当用户运行应用程序时,它会将一些文本添加到文件中并将其保存在本地系统的某个位置,当用户尝试再次运行应用程序时,我检查文件并相应地处理情况,但存在一些问题这样,如果应用程序异常终止,我将无法删除该文件,在这种情况下,当用户尝试运行应用程序时,系统会显示应用程序已在运行但实际上应用程序异常终止的警报。

我做了一些研发,发现我可以读取 Windows 任务管理器列表,然后我可以获取并检查我的应用程序是否正在运行。它工作正常,但在测试期间我遇到了一个问题,即 Windows 中有一个名为“tasklist”的软件/实用程序,转到“start --> run”并键入 tasklist,它会显示任务列表。如果此实用程序未安装在您的系统上或由于某种原因被删除/损坏,那么这将不起作用,并且会出现同样的问题,即用户可以多次启动该应用程序。这是访问任务管理器项目的代码

Process p = Runtime.getRuntime().exec(
                System.getenv("windir") + "/system32/" + "tasklist.exe");

BufferedReader input = new BufferedReader(new InputStreamReader(
                p.getInputStream()));
while ((line = input.readLine()) != null) {
/*
Make the comparison here and show alert.
*/

}

问题:检查应用程序是否已经运行的好方法是什么?我将 Java 用于应用程序,并使用高级安装程序来创建应用程序的安装程序。

4

2 回答 2

5

启动应用程序。使用Java Web Start并使用SingleInstanceService. 请参阅演示。用于(演示和)示例代码的 SingleInstanceService

我正在使用 .. 高级安装程序来创建安装程序

请注意,JWS:

  1. 也是一个应用程序安装程序。所以我建议这条路线作为使用“高级安装程序” 的替代方案。
  2. 由 Java (Sun/Oracle) 的制造商提供。
于 2013-06-28T11:42:43.120 回答
1

查看http://ss64.com/nt/wmic.html 并尝试

String line;
try {
    Process proc = Runtime.getRuntime().exec("wmic.exe");
    BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    OutputStreamWriter oStream = new OutputStreamWriter(proc.getOutputStream());
    oStream .write("process where name='THE NAME OF YOUR PROCESS.exe'");
    oStream .flush();
    oStream .close();
    while ((line = input.readLine()) != null) {
        System.out.println(line);
    }: 
    input.close();
} catch (IOException ioe) {
    ioe.printStackTrace();
}

礼貌:如何通过 Java 检测特定进程是否在 Windows 下运行?

于 2013-06-28T11:41:24.167 回答