如何获得当前打开的窗口/过程与Java的列表?

有谁知道如何获得当前打开的窗口或使用Java的本地机器的进程?

我想要做的是:列出当前打开的任务,窗口或进程打开,如Windows任务pipe理器,但使用多平台的方法 – 只使用Java,如果可能的话。

这是从命令“ ps -e ”parsing进程列表的另一种方法:

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 …”etc …(第三行),看起来像这样:

 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的任务列表)。

不幸的是,这意味着你将不得不编写一些parsing例程来从两者中读取数据。

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

YAJSW (又一个Java服务包装器)看起来好像它具有基于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("------------------"); } 

没有平台中立的做法。 在1.6版本的Java中,添加了一个“ 桌面 ”类,允许浏览,编辑,邮寄,打开和打印URI的便携方式。 有可能这个课程有可能会延伸到支持stream程,但是我对此表示怀疑。

如果您只对Java进程感兴趣,则可以使用java.lang.management api获取JVM上的线程/内存信息。

使用代码parsingps aux for linux和windows任务列表是您的最佳select,直到更普遍的东西出现。

对于Windows,可以参考: http : //www.rgagnon.com/javadetails/java-0593.html

Linux也可以通过grep ps aux的结果,这将使得处理/search变得快速和简单。 我相信你也可以find类似的窗口。

对于我使用的窗口如下:

  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"); 

最后,在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("-"); } 

编辑:“将”→“是”

 package com.vipul; import java.applet.Applet; import java.awt.Checkbox; import java.awt.Choice; import java.awt.Font; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class BatchExecuteService extends Applet { public Choice choice; public void init() { setFont(new Font("Helvetica", Font.BOLD, 36)); choice = new Choice(); } public static void main(String[] args) { BatchExecuteService batchExecuteService = new BatchExecuteService(); batchExecuteService.run(); } List<String> processList = new ArrayList<String>(); public void run() { try { Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("D:\\server.bat"); process.getOutputStream().close(); InputStream inputStream = process.getInputStream(); InputStreamReader inputstreamreader = new InputStreamReader( inputStream); BufferedReader bufferedrReader = new BufferedReader( inputstreamreader); BufferedReader bufferedrReader1 = new BufferedReader( inputstreamreader); String strLine = ""; String x[]=new String[100]; int i=0; int t=0; while ((strLine = bufferedrReader.readLine()) != null) { // System.out.println(strLine); String[] a=strLine.split(","); x[i++]=a[0]; } // System.out.println("Length : "+i); for(int j=2;j<i;j++) { System.out.println(x[j]); } } catch (IOException ioException) { ioException.printStackTrace(); } } } 
  You can create batch file like 

TASKLIST / v / FI“STATUS eq running”/ FO“CSV”/ FI“Username eq LHPL002 \ soft”/ FI“MEMUSAGE gt 10000”/ FI“Windowtitle ne N / A”/ NH

同样的问题( Windows使用Java运行应用程序列表 )

我发现这个答案( https://stackoverflow.com/a/2206526 )与菲利普普通输出wmic.exe

 try{ Process proc = Runtime.getRuntime().exec("wmic.exe"); BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream())); OutputStreamWriter oStream = new OutputStreamWriter(proc.getOutputStream()); oStream.write("process get caption"); oStream.flush(); oStream.close(); String line; while ((line = input.readLine()) != null){ if(!line.isEmpty() && !line.startsWith("wmic:root\\cli")) { System.out.println(line); } } input.close(); }catch (IOException ioe){ioe.printStackTrace();}