103 votes

Comment obtenir une liste des fenêtres / processus ouverts en cours avec Java?

Est-ce que quelqu'un sait comment obtenir les fenêtres ou processus actuellement ouverts d'une machine locale en utilisant Java?

Ce que j'essaie de faire, c'est: lister la tâche ouverte, les fenêtres ou les processus ouverts, comme dans Windows Taskmanager, mais en utilisant une approche multi-plateforme - en utilisant uniquement Java si possible.

109voto

ramayac Points 1830

Ceci est une autre approche pour analyser la liste de processus à partir de la commande " 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 vous utilisez Windows, vous devriez alors changer la ligne: "Traiter p = Runtime.getRun ..." etc ... (3ème ligne), par exemple:

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

J'espère que l'info aide!

25voto

Emmanuel Bourg Points 4555

Sous Windows, il existe une alternative utilisant 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);
    }
}
 

10voto

jodonnell Points 14999

La seule façon de le faire consiste à appeler une application de ligne de commande qui effectue le travail à votre place, puis à effectuer une capture d'écran de la sortie (comme le ps de Linux et la liste des tâches de Windows).

Malheureusement, cela signifie que vous devrez écrire des routines d'analyse pour lire les données des deux.

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

7voto

SamWest Points 63

YAJSW (Yet Another Java Service Wrapper) semble avoir des implémentations JNA de son interface org.rzo.yajsw.os.TaskList pour win32, linux, bsd et solaris et est sous licence LGPL. Je n'ai pas essayé d'appeler ce code directement, mais YAJSW fonctionne vraiment bien quand je l'ai utilisé dans le passé, vous ne devriez donc pas avoir trop d'inquiétude.

4voto

hazzen Points 7315

Il n'existe pas de plate-forme neutre façon de le faire. Dans la version 1.6 de Java, un "Bureau" de la classe a été ajouté le permet portables de navigation, d'édition, de diffusion, d'ouverture, et l'impression d'URI. Il est possible que cette classe puisse un jour être étendu pour prendre en charge les processus, mais j'en doute.

Si vous êtes seulement curieux dans les processus Java, vous pouvez utiliser le java.lang.gestion des api pour obtenir thread/informations sur la mémoire de la JVM.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X