使用 Java 获取应用名称 运行

Get the Apps name running using Java

我使用

获取所有进程
import java.io.*;
public class test {

/**
 * Creates a new instance of <code>test</code>.
 */
public test() {
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    String line;
    try {
        Process p = Runtime.getRuntime().exec("tasklist.exe");
        BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while ((line = input.readLine()) != null)
        {
           System.out.println(line); 
        }
        input.close();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}
}

但我只需要在 windows 上列出应用程序 运行 的名称。

例如Teamviewer、GoogleChrome等

是否可以使用此 Java 流程?我该怎么做?

假设您要在 "Applications" 中的任务管理器中查找任务的名称。应用程序的名称是 tasklist 命令结果中的那些条目,它们具有 "Window Title",您只能在详细模式 运行 tasklist

中获得
tasklist.exe /V

如果您希望结果更容易解析,您应该使用 /NH 标志生成 CSV 输出以省略 header:

的显示
tasklist.exe /V /NH /FO CSV

现在您可以提取每行的第 9 个元素

String[] elements = line.split(",");
if (!"\"N/A\"".equals(elements[8])){
    System.out.println(elements[8]);
}

也许您需要对 tasklist 命令应用一些过滤以获得准确的应用程序,tasklist /? 将为您提供详细信息。

我发现使用 vbscript 的效果最好。从任务列表中过滤结果似乎很棘手。尝试创建一个扩展名为 vbs 的文件,内容如下:

Set Word = CreateObject("Word.Application")
Set Tasks = Word.Tasks
Set fso = CreateObject ("Scripting.FileSystemObject")
Set stdout = fso.GetStandardStream (1)

For Each Task in Tasks
   If Task.Visible  Then 
     stdout.WriteLine Task.Name
   End If
Next
Word.Quit

现在只需将您的代码更改为 运行 cscript 而不是 tasklist:

Process p = Runtime.getRuntime().exec("cscript C:\<path to your vbsfile>\test.vbs");

更正: 从 if 语句中删除了 Tasks(Task).WindowState=1。此过滤器过滤掉除最大化 windows.

之外的所有内容

注意:输出仍然与任务管理器不同。但这是微软定义获取应用程序列表的方式:https://technet.microsoft.com/en-us/library/ff405673.aspx