如何使用Java获取当前打开的窗口/进程的列表?
时间:2020-03-05 18:50:53 来源:igfitidea点击:
有谁知道如何使用Java获取当前打开的窗口或者本地计算机的进程?
我想做的是:像Windows Taskmanager一样列出当前打开的任务,窗口或者打开的进程,但是如果可能的话,请使用仅使用Java的多平台方法。
解决方案
回答
我能想到的唯一方法是调用一个为我们完成任务的命令行应用程序,然后对输出进行屏幕抓取(例如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 }
回答
这是从命令" 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的1.6版本中,添加了一个"桌面"类,该类允许以可移植的方式浏览,编辑,邮寄,打开和打印URI。可能有一天有可能将此课程扩展到支持流程,但我对此表示怀疑。
如果我们只是对Java进程感到好奇,则可以使用java.lang.management api来获取JVM上的线程/内存信息。
回答
YAJSW(还有另一个Java服务包装程序)看起来像它的org.rzo.yajsw.os.TaskList接口的基于JNA的实现,适用于win32,linux,bsd和solaris,并且已获得LGPL许可。我没有尝试直接调用此代码,但是当我过去使用YAJSW时,它的工作原理非常好,因此我们不必担心太多。