java怎么取得本地计算机的任务管理器的应用程序列表,不是进程的列表,我的目的是java应用程序在执行之前,先判断某一个IE窗口是否开着,如果此IE已经关闭了,应用程序列表里就没有该IE的内容,那么,这个java应用程序就不执行了。

解决方案 »

  1.   


    Process proc = Runtime.getRuntim().exec("tasklist");
    BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    String info = reader.readLine();
    while (info != null)
    {
        System.out.println(info);
        infor = reader.readLine();
    }
      

  2.   

    pauliuyou:谢谢你的回复,但是,你提供的代码还是得到进程的内容啊,我要的是得到任务管理器里面的应用程序的列表。
    还有没有什么办法,我都想了2天了
      

  3.   

    用c写,然后编译成dll,java去调用
      

  4.   

    guestdaocao:谢谢你的回复,
    只有这种办法吗?但是我不会写C语言,能不能提供一下code,
    而且怎么编译成dll阿,对不起,我是菜鸟,麻烦了。
      

  5.   

    比较简单的就是用c#,然后用java调用。就是要多装个c#的运行环境。
      

  6.   

    下面的两个类就可以的,也可以到我的空间里下载“Java版任务管理器”,免积分的import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JPopupMenu;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.ListSelectionModel;
    import javax.swing.plaf.basic.BasicComboPopup;/*
     * 前台显示界面
     * 作者:宋海康
     */
    public class TaskList extends JFrame {
    static JTable table=null;
    JScrollPane p1;
    JComboBox box;
    JPopupMenu  rightmenu;

    private TaskListCon con=new TaskListCon();


    public TaskList(){
    super("Java版任务管理器(黑天鹅组件)");
    this.addItem();
    this.pack();
    this.setVisible(true);
    this.setLocation(150,100);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) throws Exception {
    new TaskList();
    }

    public void addItem(){
    Container f=this.getContentPane();
    table=new JTable();
    table=con.showList(table);
     //设置一次选择一行
    table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    //设置选中行的前景和背景
    table.setSelectionBackground(Color.lightGray);
    table.setSelectionForeground(Color.WHITE); 
    //************************右键菜单事件 *********************************************   
    box=new JComboBox();
    box.addItem("根据名称关闭进程");
    box.addItem("根据PID关闭进程"); 
    box.addItem("关闭进程树"); 
    box.addItem("刷新进程列表"); 
    //右键菜单控件
    rightmenu=new  BasicComboPopup(box);
    rightmenu.setPopupSize(130, 100);//调整弹出菜单的大小
    //监听右键菜单的鼠标事件
    box.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent arg0) {
    rightKey();
    }
    }); //添加右键菜单到table上
    table.setComponentPopupMenu(rightmenu);
    p1=new JScrollPane(table);//没有JScrollPane的话,标题不会出现
    f.setLayout(new BorderLayout());
    f.add(p1,BorderLayout.CENTER);
    }


    // Table的右键事件
    public void rightKey(){
    int r= table.getSelectedRow();
    if(box.getSelectedIndex()==3){//刷新
    con.showList(table);
    rightmenu.hide();//隐藏右键
    }else if(r==-1)
    {
    //new Audio().soundPlay("/sound/warning.wav");
    JOptionPane.showMessageDialog(null, "对不起!你还没有选中一行!" ,
    "系统提示",JOptionPane.WARNING_MESSAGE);
    }else{
    //获得选中单元行的值
    Object name=table.getModel().getValueAt(r,1);
    Object pid= table.getModel().getValueAt(r,2);
    // 处理加为好友请求
    if(box.getSelectedIndex()==0)
    {//强制结束指定的进程名子
    con.javaDos("taskkill /F /im "+name,table);
    rightmenu.hide();//隐藏右键
    }
    if(box.getSelectedIndex()==1)
    {//强制结束指定PID的进程
    con.javaDos("taskkill /F /pid "+pid,table);
    rightmenu.hide();//隐藏右键
    }
    if(box.getSelectedIndex()==2)
    {//强制结束指定PID的进程树
    con.javaDos("taskkill /F /T /pid "+pid,table);
    rightmenu.hide();//隐藏右键
    }

    }

    }
    import java.io.BufferedReader;
    import java.io.InputStreamReader;import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableColumn;
    /*
     * 后台控制程序
     * 作者:宋海康
     */
    public class TaskListCon {

    //核心程序,用命令获得进程列表
    public DefaultTableModel tasklist(){
    String [][] result=new String[60][10];//创建存放进程的数组
    String[] title=null;
    Process pro = null;//命令返回的结果
    try {
    pro=Runtime.getRuntime().exec("cmd /c tasklist /FO csv");
    InputStreamReader ipsr=new InputStreamReader(pro.getInputStream());//把得到的输入流转换为字节流
    BufferedReader br=new BufferedReader(ipsr);//  把字节流转换为字符流
    String res=null;
    int x=0;
    while((res=br.readLine())!=null){
    String[] value=res.replace("\",\"", ";").replace("\"", "").split(";");
    if(x==0){
    title=new String[value.length+1];
    }
    for (int i = 0; i < value.length+1; i++) {
    //如果是标题行
    if(x==0){
    if(i==0){
    title[i]="编号";
    }else{
    title[i]=value[i-1];
    }
    }
    else if(i==0){//显示编号
    result[x-1][i]=x+"";
    }else{
    result[x-1][i]=value[i-1];
    }
    }
    //如果不是正规的进程格式则不显示
    if(value.length<10&&value.length>1){
    x++;
    }
    //规定最多只显示60条进程记录
    if(x==60){
    break;
    }
    }
    } catch (Exception e) {
    e.printStackTrace();
    }


    DefaultTableModel modle=new DefaultTableModel(result,title){
    public boolean isCellEditable(int row, int column) {return false;}
    }; 

    return modle;
    }

    //执行命令
    public void javaDos(String cmd,JTable table){
    try {
    Runtime.getRuntime().exec("cmd /c "+cmd);
    Thread thread=new Thread();
    thread.sleep(200);//休眠一下再刷新
    showList(table);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    // 对table进行赋值
    public JTable showList(JTable table){
    //设置表格的标题行
    DefaultTableModel modle=tasklist();
    table.setModel(modle);
    //设置table的列宽
    TableColumn Column1 = table.getColumnModel().getColumn(0);
    Column1.setPreferredWidth(30);
    TableColumn Column2 = table.getColumnModel().getColumn(1);
    Column2.setPreferredWidth(150);
    TableColumn Column6 = table.getColumnModel().getColumn(5);
    Column6.setPreferredWidth(80);
    return table;
    }


    }