当前位置:  开发笔记 > 编程语言 > 正文

如何使用Java获取当前打开的窗口/进程列表?

如何解决《如何使用Java获取当前打开的窗口/进程列表?》经验,为你挑选了6个好方法。

有没有人知道如何使用Java获取当前打开的窗口或本地机器的进程?

我要做的是:列出当前打开的任务,窗口或进程打开,就像在Windows Taskmanager中一样,但是使用多平台方法 - 如果可能的话只使用Java.



1> ramayac..:

这是从命令" ps -e " 解析进程列表的另一种方法:

try {
    String line;
    Process p = Runtime.getRuntime().exec("ps -e");
    BufferedReader input =
            new BufferedReader(new InputStreamReader(p.getInputStream()));
    while ((line = input.readLine()) != null) {
        System.out.println(line); //<-- Parse data here.
    }
    input.close();
} catch (Exception err) {
    err.printStackTrace();
}

如果您使用的是Windows,那么您应该更改以下行:"Process p = Runtime.getRun ..."等...(第3行),如下所示:

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

希望信息有所帮助!


在Windows上,运行`tasklist.exe/fo csv/nh`以获取CSV格式的列表,这更容易解析.

2> Hugues M...:

最后,使用Java 9+可以实现ProcessHandle:

public static void main(String[] args) {
    ProcessHandle.allProcesses()
            .forEach(process -> System.out.println(processDetails(process)));
}

private static String processDetails(ProcessHandle process) {
    return String.format("%8d %8s %10s %26s %-40s",
            process.pid(),
            text(process.parent().map(ProcessHandle::pid)),
            text(process.info().user()),
            text(process.info().startInstant()),
            text(process.info().commandLine()));
}

private static String text(Optional optional) {
    return optional.map(Object::toString).orElse("-");
}

输出:

    1        -       root   2017-11-19T18:01:13.100Z /sbin/init
  ...
  639     1325   www-data   2018-12-04T06:35:58.680Z /usr/sbin/apache2 -k start
  ...
23082    11054    huguesm   2018-12-04T10:24:22.100Z /.../java ProcessListDemo



3> Emmanuel Bou..:

在Windows上有一个使用JNA的替代方案:

import com.sun.jna.Native;
import com.sun.jna.platform.win32.*;
import com.sun.jna.win32.W32APIOptions;

public class ProcessList {

    public static void main(String[] args) {
        WinNT winNT = (WinNT) Native.loadLibrary(WinNT.class, W32APIOptions.UNICODE_OPTIONS);

        WinNT.HANDLE snapshot = winNT.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0));

        Tlhelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference();

        while (winNT.Process32Next(snapshot, processEntry)) {
            System.out.println(processEntry.th32ProcessID + "\t" + Native.toString(processEntry.szExeFile));
        }

        winNT.CloseHandle(snapshot);
    }
}


您可以通过调用`GetModuleFileName`来获取完整路径.有关示例,请参阅http://stackoverflow.com/questions/7521693/converting-c-sharp-to-java-jna-getmodulefilename-from-hwnd.

4> jodonnell..:

我能想到的唯一方法是调用一个命令行应用程序为你完成工作,然后屏幕显示输出(如Linux的ps和Window的任务列表).

不幸的是,这意味着你必须编写一些解析例程来从两者中读取数据.

Process proc = Runtime.getRuntime().exec ("tasklist.exe");
InputStream procOutput = proc.getInputStream ();
if (0 == proc.waitFor ()) {
    // TODO scan the procOutput for your data
}



5> SamWest..:

YAJSW(又一个Java服务包装器)看起来像是针对win32,linux,bsd和solaris的org.rzo.yajsw.os.TaskList接口的基于JNA的实现,并且是LGPL许可证.我没有试过直接调用这个代码,但是YAJSW在我过去使用它的时候效果很好,所以你不应该有太多的担忧.



6> profesor_fal..:

您可以使用jProcesses轻松检索正在运行的进程列表

List processesList = JProcesses.getProcessList();

for (final ProcessInfo processInfo : processesList) {
    System.out.println("Process PID: " + processInfo.getPid());
    System.out.println("Process Name: " + processInfo.getName());
    System.out.println("Process Used Time: " + processInfo.getTime());
    System.out.println("Full command: " + processInfo.getCommand());
    System.out.println("------------------");
}


我想你会谈论windows实现.是的,通常WMI查询需要一些时间.一如既往地取决于用例.如果你需要每10毫秒执行一次查询,是的,它太慢了.
推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有