有没有人知道如何使用Java获取当前打开的窗口或本地机器的进程?
我要做的是:列出当前打开的任务,窗口或进程打开,就像在Windows Taskmanager中一样,但是使用多平台方法 - 如果可能的话只使用Java.
这是从命令" 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");
希望信息有所帮助!
最后,使用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
在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); } }
我能想到的唯一方法是调用一个命令行应用程序为你完成工作,然后屏幕显示输出(如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 }
YAJSW(又一个Java服务包装器)看起来像是针对win32,linux,bsd和solaris的org.rzo.yajsw.os.TaskList接口的基于JNA的实现,并且是LGPL许可证.我没有试过直接调用这个代码,但是YAJSW在我过去使用它的时候效果很好,所以你不应该有太多的担忧.
您可以使用jProcesses轻松检索正在运行的进程列表
ListprocessesList = 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("------------------"); }