#java #windows
Как в Java следить за процессами Windows в реальном времени?
Программа должна следить за процессами в фоне, и как только запускается нужный процесс
выполнять определенное действие, затем ждать завершение данного процесса. По завершению
выполнять определенные действия и снова следить за его запуском.
Вот что есть:
try {
String line;
Process p = Runtime.getRuntime().exec(System.getenv("windir") + "\\system32\\"
+ "tasklist.exe");
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
// Здесь идет обработка всех процессов
}
input.close();
} catch (Exception err) {
err.printStackTrace();
}
В цикле обновлять Process p мне кажется неправильно, возможно существует другой способ
слежения за процессами?
Ответы
Ответ 1
Нормальный способ мониторить системные процессы появится только в Java-9 (смотрите JEP-102). Тогда появится счастье, можно будет писать в духе if(ProcessHandle.allProcesses().anyMatch(info -> info.command() .filter(str -> str.contains("myProcessName")).isPresent())) { // Нужный процесс запущен } Сейчас, увы, нужны всякие костыли. Есть вариант для винды — использовать 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); } } Мне такой вариант кажется более надёжным, чем периодический запуск tasklist.exe.
Комментариев нет:
Отправить комментарий