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

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

Lo que trato de hacer es: listar 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.

Este es otro enfoque 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á usando Windows, entonces debe cambiar la línea: "Proceso p = Runtime.getRun ..." etc ... (3ra línea), para una que se ve así:

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

Espero que la información ayude!

En Windows hay una alternativa usando 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); } } 

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("-"); } 

Editar: “será” → “es”

La única forma en que puedo pensar en hacerlo es invocando una aplicación de línea de comandos que hace el trabajo por usted y luego grabando la salida (como el ps de Linux y la lista de tareas de Windows).

Desafortunadamente, eso significará que tendrá 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 } 

YAJSW (Yet Another Java Service Wrapper) parece que tiene implementaciones basadas en JNA de su interfaz org.rzo.yajsw.os.TaskList para win32, linux, bsd y solaris y está bajo una licencia LGPL. No he intentado llamar este código directamente, pero YAJSW funciona muy bien cuando lo he usado en el pasado, por lo que no debería tener demasiadas preocupaciones.

Puede recuperar fácilmente la lista de procesos en ejecución utilizando 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("------------------"); } 

No hay una forma neutral de plataforma de hacer esto. En la versión 1.6 de Java, se agregó una clase ” Escritorio ” que permite formas portátiles de navegar, editar, enviar por correo, abrir e imprimir URI. Es posible que esta clase se extienda algún día a procesos de soporte, pero lo dudo.

Si solo tiene curiosidad por los procesos de Java, puede usar la API java.lang.management para obtener información sobre hilos / memoria en la JVM.

Para Windows uso siguiente:

  Process process = new ProcessBuilder("tasklist.exe", "/fo", "csv", "/nh").start(); new Thread(() -> { Scanner sc = new Scanner(process.getInputStream()); if (sc.hasNextLine()) sc.nextLine(); while (sc.hasNextLine()) { String line = sc.nextLine(); String[] parts = line.split(","); String unq = parts[0].substring(1).replaceFirst(".$", ""); String pid = parts[1].substring(1).replaceFirst(".$", ""); System.out.println(unq + " " + pid); } }).start(); process.waitFor(); System.out.println("Done"); 

El uso de código para analizar ps aux para Linux y la tasklist de tasklist para Windows son sus mejores opciones, hasta que aparezca algo más general.

Para Windows, puede hacer referencia a: http://www.rgagnon.com/javadetails/java-0593.html

Linux también puede canalizar los resultados de ps aux a grep , lo que haría el procesamiento / búsqueda rápida y fácil. Estoy seguro de que puedes encontrar algo similar para Windows también.

Esto podría ser útil para aplicaciones con un JRE integrado: busco el nombre de la carpeta desde la que estoy ejecutando la aplicación: así que si su aplicación se está ejecutando desde:

  C:\Dev\build\SomeJavaApp\jre-9.0.1\bin\javaw.exe 

entonces puedes encontrar si ya se está ejecutando en J9, por:

  public static void main(String[] args) { AtomicBoolean isRunning = new AtomicBoolean(false); ProcessHandle.allProcesses() .filter(ph -> ph.info().command().isPresent() && ph.info().command().get().contains("SomeJavaApp")) .forEach((process) -> { isRunning.set(true); }); if (isRunning.get()) System.out.println("SomeJavaApp is running already"); } 
 package com.vipul; import java.applet.Applet; import java.awt.Checkbox; import java.awt.Choice; import java.awt.Font; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class BatchExecuteService extends Applet { public Choice choice; public void init() { setFont(new Font("Helvetica", Font.BOLD, 36)); choice = new Choice(); } public static void main(String[] args) { BatchExecuteService batchExecuteService = new BatchExecuteService(); batchExecuteService.run(); } List processList = new ArrayList(); public void run() { try { Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("D:\\server.bat"); process.getOutputStream().close(); InputStream inputStream = process.getInputStream(); InputStreamReader inputstreamreader = new InputStreamReader( inputStream); BufferedReader bufferedrReader = new BufferedReader( inputstreamreader); BufferedReader bufferedrReader1 = new BufferedReader( inputstreamreader); String strLine = ""; String x[]=new String[100]; int i=0; int t=0; while ((strLine = bufferedrReader.readLine()) != null) { // System.out.println(strLine); String[] a=strLine.split(","); x[i++]=a[0]; } // System.out.println("Length : "+i); for(int j=2;j 
  You can create batch file like 

LISTA DE TAREAS / v / FI "ESTADO eq en ejecución" / FO "CSV" / FI "Nombre de usuario eq LHPL002 \ soft" / FI "MEMUSAGE gt 10000" / FI "Título de ventana ne N / A" / NH