Вопрос-ответ

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

Как получить список текущих открытых окон / процессов с помощью 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, то вам следует изменить строку: "Process p = Runtime.getRun ..." и т.д... (3-я строка), на ту, которая выглядит следующим образом:

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

Надеюсь, эта информация поможет!

Ответ 2

Наконец, с 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
Ответ 3

В 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);
}
}
Ответ 4

The only way I can think of doing it is by invoking a command line application that does the job for you and then screenscraping the output (like Linux's ps and Window's tasklist).

Unfortunately, that'll mean you'll have to write some parsing routines to read the data from both.

Process proc = Runtime.getRuntime().exec ("tasklist.exe");
InputStream procOutput = proc.getInputStream ();
if (0 == proc.waitFor ()) {
// TODO scan the procOutput for your data
}
java