Javaを使用して現在開いているウィンドウまたはローカルマシンのプロセスを取得する方法を知っている人はいますか?
私がやろうとしているのは、現在開いているタスク、ウィンドウ、または開いているプロセスをWindowsタスクマネージャーのようにリストしますが、マルチプラットフォームアプローチを使用して、可能であればJavaのみを使用します。
これは、コマンド " 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");
情報が役立つことを願っています!
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);
}
}
私がそれを行うことを考えることができる唯一の方法は、あなたのために仕事をするコマンドラインアプリケーションを呼び出して、それから出力をスクリーンスクレイピングすることです(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
}
YAJSW (Yet Another Java Service Wrapper) は、win32、linux、bsd、solaris 用の org.rzo.yajsw.os.TaskList インターフェースの JNA ベースの実装を持ち、LGPL ライセンスの下にあるようです。このコードを直接呼び出してみたことはありませんが、過去に使用した YAJSW は非常にうまく機能するので、あまり心配する必要はありません。
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("------------------");
}
これを行うためのプラットフォームに依存しない方法はありません。Javaの1.6リリースでは、「デスクトップ」クラスが追加され、URIの参照、編集、メール送信、オープン、および印刷のポータブルな方法が可能になりました。このクラスはいつかプロセスをサポートするように拡張される可能性がありますが、私はそれを疑っています。
Javaプロセスだけに興味がある場合は、java.lang.management apiを使用して、JVMのスレッド/メモリ情報を取得できます。
ps aux
より一般的なものが登場するまでは、コードを使用して Linux とWindows の解析を行うtasklist
のが最善の選択肢です。
Windows の場合は、http ://www.rgagnon.com/javadetails/java-0593.html を参照できます。
ps aux
Linux はthroughの結果もパイプできgrep
ます。これにより、処理/検索が迅速かつ簡単になります。Windowsでも同様のものを見つけることができると確信しています。