102

Javaを使用して現在開いているウィンドウまたはローカルマシンのプロセスを取得する方法を知っている人はいますか?

私がやろうとしているのは、現在開いているタスク、ウィンドウ、または開いているプロセスをWindowsタスクマネージャーのようにリストしますが、マルチプラットフォームアプローチを使用して、可能であればJavaのみを使用します。

4

14 に答える 14

108

これは、コマンド " 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");

情報が役立つことを願っています!

于 2008-09-10T18:30:12.680 に答える
25

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);
    }
}
于 2012-02-27T09:53:35.280 に答える
10

私がそれを行うことを考えることができる唯一の方法は、あなたのために仕事をするコマンドラインアプリケーションを呼び出して、それから出力をスクリーンスクレイピングすることです(LinuxのpsやWindowのタスクリストのように)。

残念ながら、それは、両方からデータを読み取るためにいくつかの解析ルーチンを作成する必要があることを意味します。

Process proc = Runtime.getRuntime().exec ("tasklist.exe");
InputStream procOutput = proc.getInputStream ();
if (0 == proc.waitFor ()) {
    // TODO scan the procOutput for your data
}
于 2008-09-10T17:00:32.240 に答える
7

YAJSW (Yet Another Java Service Wrapper) は、win32、linux、bsd、solaris 用の org.rzo.yajsw.os.TaskList インターフェースの JNA ベースの実装を持ち、LGPL ライセンスの下にあるようです。このコードを直接呼び出してみたことはありませんが、過去に使用した YAJSW は非常にうまく機能するので、あまり心配する必要はありません。

于 2010-12-16T21:40:45.320 に答える
5

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("------------------");
}
于 2016-02-14T09:27:29.807 に答える
4

これを行うためのプラットフォームに依存しない方法はありません。Javaの1.6リリースでは、「デスクトップ」クラスが追加され、URIの参照、編集、メール送信、オープン、および印刷のポータブルな方法が可能になりました。このクラスはいつかプロセスをサポートするように拡張される可能性がありますが、私はそれを疑っています。

Javaプロセスだけに興味がある場合は、java.lang.management apiを使用して、JVMのスレッド/メモリ情報を取得できます。

于 2008-09-10T18:48:46.677 に答える
3

ps auxより一般的なものが登場するまでは、コードを使用して Linux とWindows の解析を行うtasklistのが最善の選択肢です。

Windows の場合は、http ://www.rgagnon.com/javadetails/java-0593.html を参照できます。

ps auxLinux はthroughの結果もパイプできgrepます。これにより、処理/検索が迅速かつ簡単になります。Windowsでも同様のものを見つけることができると確信しています。

于 2012-05-17T15:16:53.003 に答える