tipos - swing java ejemplos
¿Cómo obtener una lista de ventanas/procesos abiertos actuales con Java? (10)
¿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.
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.
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);
}
}
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!
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
}
No hay una forma neutral de plataforma de hacer esto. En la versión 1.6 de Java, se agregó una clase " Desktop " 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");
Puede recuperar fácilmente la lista de procesos en ejecución utilizando jProcesses
List<ProcessInfo> 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("------------------");
}
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.
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<String> processList = new ArrayList<String>();
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<i;j++)
{
System.out.println(x[j]);
}
}
catch (IOException ioException)
{
ioException.printStackTrace();
}
}
}
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