Как получить список текущих открытых окон/процессов с Java?
Кто-нибудь знает, как получить текущие открытые окна или процесс локального компьютера с помощью Java?
То, что я пытаюсь сделать, это: показать текущую открытую задачу, открыть окна или процесс, как в Windows Taskmanager, но использовать многоплатформенный подход - используя только Java, если это возможно.
Ответы
Ответ 1
Это еще один подход к анализу списка процессов из команды " 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, вам следует изменить строку: "Процесс p = Runtime.getRun..." и т.д. (3-я строка), для следующего:
Process p = Runtime.getRuntime().exec
(System.getenv("windir") +"\\system32\\"+"tasklist.exe");
Надеемся, что информация поможет!
Ответ 2
В 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);
}
}
Ответ 3
Наконец, с помощью 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
Ответ 4
Единственный способ, которым я могу это сделать, - вызвать приложение командной строки, которое выполняет задание для вас, а затем экранировать вывод (например, Linux ps и Window tasklist).
К сожалению, это будет означать, что вам придется написать некоторые процедуры разбора для чтения данных из обоих.
Process proc = Runtime.getRuntime().exec ("tasklist.exe");
InputStream procOutput = proc.getInputStream ();
if (0 == proc.waitFor ()) {
// TODO scan the procOutput for your data
}
Ответ 5
YAJSW (еще один Java Wrapper) выглядит так, как будто он реализовал JNA-версию своего org.rzo.yajsw.os. Интерфейс TaskList для win32, linux, bsd и solaris и находится под лицензией LGPL. Я не пробовал называть этот код напрямую, но YAJSW работает очень хорошо, когда я использовал его в прошлом, поэтому у вас не должно быть слишком много забот.
Ответ 6
Вы можете легко получить список запущенных процессов, используя 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("------------------");
}
Ответ 7
Нет такого нейтрального для платформы способа. В версии 1.6 для Java был добавлен класс Desktop, который позволяет переносить способы просмотра, редактирования, рассылки, открытия и печать URI. Возможно, этот класс может быть продолжен для поддержки процессов, но я сомневаюсь в этом.
Если вам интересно только в процессах Java, вы можете использовать java.lang.management api для получения информации о потоке/памяти на JVM.
Ответ 8
Для окон я использую следующее:
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");
Ответ 9
Использование кода для синтаксического анализа ps aux
для linux и tasklist
для окон - это ваши лучшие варианты, пока не появится нечто более общее.
Для окон вы можете ссылаться: http://www.rgagnon.com/javadetails/java-0593.html
Linux может транслировать результаты ps aux
через grep
тоже, что сделает обработку/поиск быстрой и легкой. Я уверен, что вы можете найти что-то похожее и для окон.
Ответ 10
Это может быть полезно для приложений со связанным JRE: я просматриваю имя папки, из которой я запускаю приложение: поэтому, если вы используете приложение, выполните следующие действия:
C:\Dev\build\SomeJavaApp\jre-9.0.1\bin\javaw.exe
то вы можете найти, если он уже запущен в J9, путем:
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");
}
Ответ 11
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
TASKLIST/v/FI "STATUS eq running" /FO "CSV" /FI "Имя пользователя eq LHPL002\soft" /FI "MEMUSAGE gt 10000" /FI "Windowtitle ne N/A" /NH
Ответ 12
Тот же вопрос (Windows запускает список приложений с помощью Java)
Я нашел этот ответ (fooobar.com/info/76711/...) wmic.exe с нормальным выходом от Philippe
try{
Process proc = Runtime.getRuntime().exec("wmic.exe");
BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream()));
OutputStreamWriter oStream = new OutputStreamWriter(proc.getOutputStream());
oStream.write("process get caption");
oStream.flush();
oStream.close();
String line;
while ((line = input.readLine()) != null){
if(!line.isEmpty() && !line.startsWith("wmic:root\\cli")) {
System.out.println(line);
}
}
input.close();
}catch (IOException ioe){ioe.printStackTrace();}