有谁知道如何使用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...”(第三行),为以下代码:
Process p = Runtime.getRuntime().exec
(System.getenv("windir") +"\\system32\\"+"tasklist.exe");
希望这些信息对你有所帮助!
最后,使用Java 9+可以通过ProcessHandle
实现:
public static void main(String[] args) {
ProcessHandle.allProcesses()
.forEach(process -> System.out.println(processDetails(process)));
}
private static String processDetails(ProcessHandle process) {
return String.format("%8d %8s %10s %26s %-40s",
process.pid(),
text(process.parent().map(ProcessHandle::pid)),
text(process.info().user()),
text(process.info().startInstant()),
text(process.info().commandLine()));
}
private static String text(Optional<?> optional) {
return optional.map(Object::toString).orElse("-");
}
输出:
1 - root 2017-11-19T18:01:13.100Z /sbin/init
...
639 1325 www-data 2018-12-04T06:35:58.680Z /usr/sbin/apache2 -k start
...
23082 11054 huguesm 2018-12-04T10:24:22.100Z /.../java ProcessListDemo
java.lang
中,所以不需要导入。 - Hugues M.import java.util.Optional;
。如果你使用一个不错的IDE(IntelliJ IDEA/NetBeans/Eclipse/...),当你将上述方法粘贴到现有类中时,必要的导入应该会自动添加。 - Eric Duminilimport 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);
}
}
GetModuleFileName
来获取完整路径。请参见 http://stackoverflow.com/questions/7521693/converting-c-sharp-to-java-jna-getmodulefilename-from-hwnd 以获取示例。 - Emmanuel BourgWMIC PROCESS
或者限制特定进程输出的方式:WMIC PROCESS WHERE name='theName'
。如果需要,您可以使用进一步的过滤器来限制输出。该命令行包含在返回的表格中的CommandLine列中(=第二列)。 - Roman Vottner我所能想到的唯一方法是调用一个命令行应用程序来为你完成工作,然后屏幕抓取输出内容(例如类似于Linux 的 ps 和 Windows 的 tasklist)。
不幸的是,这意味着您必须编写一些解析例程来读取两个来源的数据。
Process proc = Runtime.getRuntime().exec ("tasklist.exe");
InputStream procOutput = proc.getInputStream ();
if (0 == proc.waitFor ()) {
// TODO scan the procOutput for your data
}
tasklist
程序可以配置为输出CSV :) - MauganRaYAJSW(Yet Another Java Service Wrapper)似乎具有基于JNA的org.rzo.yajsw.os.TaskList接口的实现,适用于win32、linux、bsd和solaris,并且受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("------------------");
}
C:\Dev\build\SomeJavaApp\jre-9.0.1\bin\javaw.exe
您可以通过以下方式找到J9中是否已经运行:
public static void main(String[] args) {
AtomicBoolean isRunning = new AtomicBoolean(false);
ProcessHandle.allProcesses()
.filter(ph -> ph.info().command().isPresent() && ph.info().command().get().contains("SomeJavaApp"))
.forEach((process) -> {
isRunning.set(true);
});
if (isRunning.get()) System.out.println("SomeJavaApp is running already");
}
对于 Windows 系统,我使用以下方法:
Process process = new ProcessBuilder("tasklist.exe", "/fo", "csv", "/nh").start();
new Thread(() -> {
Scanner sc = new Scanner(process.getInputStream());
if (sc.hasNextLine()) sc.nextLine();
while (sc.hasNextLine()) {
String line = sc.nextLine();
String[] parts = line.split(",");
String unq = parts[0].substring(1).replaceFirst(".$", "");
String pid = parts[1].substring(1).replaceFirst(".$", "");
System.out.println(unq + " " + pid);
}
}).start();
process.waitFor();
System.out.println("Done");
ps aux
和Windows中的tasklist
是最好的选择,直到出现更通用的选项为止。ps aux
的结果传递给grep
,这样处理/搜索会变得快速简便。我相信您也可以在Windows中找到类似的东西。
tasklist.exe /fo csv /nh
,以CSV格式获取列表,这样更容易解析。 - Emmanuel Bourgps -elf | grep java
不会返回任何结果,但是ps -elf
可以正常工作。 - Itay Moav -Malimovka(.exec (Runtime/getRuntime) "tasklist"))
正确返回tasklist
进程。 - Carcigenicateexec
命令已经被弃用了,但你只需要简单地将它改为一个数组即可。Process p = Runtime.getRuntime().exec(new String[] {(System.getenv("windir") +"\\system32\\"+"tasklist.exe"} );
- Austin Whitelaw