#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.
Комментариев нет:
Отправить комментарий