¿Cómo obtener una lista de ventanas/procesos abiertos actualmente con Java?

Resuelto ramayac asked hace 16 años • 14 respuestas

¿Alguien sabe cómo puedo obtener las ventanas abiertas actuales o el proceso de una máquina local usando Java?

Lo que estoy tratando de hacer es: enumerar la tarea abierta actual, las ventanas o el proceso abierto, como en el Administrador de tareas de Windows, pero usando un enfoque multiplataforma, usando solo Java si es posible.

ramayac avatar Sep 10 '08 23:09 ramayac
Aceptado

Este es otro método para analizar la lista de procesos desde el comando " 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();
}

Si estás usando Windows, entonces deberías cambiar la línea: "Process p = Runtime.getRun..." etc... (3ª línea), por una que se vea así:

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

Espero que la información ayude!

ramayac avatar Sep 10 '2008 18:09 ramayac

Finalmente, con Java 9+ es posible con 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("-");
}

Producción:

    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
Hugues M. avatar Jul 12 '2017 21:07 Hugues M.

En Windows existe una alternativa que utiliza 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);
    }
}
Emmanuel Bourg avatar Feb 27 '2012 09:02 Emmanuel Bourg

La única forma en que se me ocurre hacerlo es invocando una aplicación de línea de comandos que haga el trabajo por usted y luego copiando la salida (como ps de Linux y la lista de tareas de Windows).

Desafortunadamente, eso significará que tendrás que escribir algunas rutinas de análisis para leer los datos de ambos.

Process proc = Runtime.getRuntime().exec ("tasklist.exe");
InputStream procOutput = proc.getInputStream ();
if (0 == proc.waitFor ()) {
    // TODO scan the procOutput for your data
}
jodonnell avatar Sep 10 '2008 17:09 jodonnell