How to get a list of current open windows/process with Java? How to get a list of current open windows/process with Java? java java

How to get a list of current open windows/process with Java?


This is another approach to parse the the process list from the command "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();}

If you are using Windows, then you should change the line: "Process p = Runtime.getRun..." etc... (3rd line), for one that looks like this:

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

Hope the info helps!


Finally, with Java 9+ it is possible with 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("-");}

Output:

    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


On Windows there is an alternative using 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);    }}