Java - 如何获取进程/任务(窗口)的状态?

时间:2017-07-24 16:38:24

标签: java

我正在JAVA与我的学校的朋友一起制作一个“应用程序”,它必须在Windows上运行进程/任务的状态。 例如,当“chrome.exe * 32”在实际打开的会话上运行时,他必须返回一个值。

我可能错了,但我在考虑使用类似的东西:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

Button btn1, btn2, btn3;

Animation show, hide;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btn1 = (Button) findViewById(R.id.btn1);
    btn2 = (Button) findViewById(R.id.btn2);
    btn3 = (Button) findViewById(R.id.btn3);

    btn1.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(final View v) {
            setBtn1();
        }
    });

    btn2.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(final View v) {
            setBtn2();
        }
    });

    btn3.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(final View v) {
            setBtn3();
        }
    });

    show = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.show);
    hide = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.hide);
}

public void setBtn1() {
    btn1.startAnimation(hide);
    btn1.setClickable(false);
    btn1.setVisibility(View.GONE);
}

public void setBtn2() {
    btn2.startAnimation(hide);
    btn2.setClickable(false);
    btn2.setVisibility(View.GONE);
}

public void setBtn3() {
    btn3.startAnimation(hide);
    btn3.setClickable(false);
    btn3.setVisibility(View.GONE);
}  
}

或者可能与进程占用的内存有关,我真的不知道如何获得这个值。

感谢。

2 个答案:

答案 0 :(得分:0)

我通过创建一个运行powershell命令并读回结果信息的进程解决了这个问题:

Process p = new ProcessBuilder()
        .command("powershell", "invoke-command", "-computerName", "MYCOMPUTER", "-filepath", ".\\someScript.psl")
        .start();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
p.waitFor();
List<String> results = new LinkedList();
String line;
while ((line == reader.readLine()) != null) results.add(line);

results现在包含您创建的流程的所有结果输入。以下是someScript.psl文件中包含的脚本:

$sched = New-Object -Com "Schedule.Service"
$sched.connect()
$out = @()
$sched.GetFolder("\").GetTasks(0) | % {
    $xml = [xml]$_.xml
    $out += New-Object psobject -Property @{
        "Name" = $_.Name
        "Status" = switch($_.State) {0 {"Unknown"} 1 {"Disabled"} 2 {"Queued"} 3 {"Ready"} $ {"Running"}}
        "NextRunTime" = $_.NextRunTime
        "LastRunTime" = $_.LastRunTime
        "LastRunResult" = $_.LastTaskResult
        "Author" = $xml.Task.Principals.Principal.UserID
        "Created" = $xml.Task.RegistrationInfo.Date
    }
}
$out | fl Name, Status, NextRunTime, LastRunTime, LastRunResult, Author, Created

答案 1 :(得分:0)

您可以使用java 9的ProcessHandle接口获取有关进程的信息。 要获取有关进程的信息,只需使用以下代码进行迭代并使用processHandle方法。

ProcessHandle.allProcesses().forEach(process -> processStateInfo(process));

下面的代码遍历所有进程并打印有关这些进程的一些信息。

public class JavaProcess {
    public static void main(String[] args) {
        ProcessHandle.allProcesses().forEach(process -> getProcessInfo(process));
    }

    private static void getProcessInfo(ProcessHandle process) {
        System.out.println("PID == "+process.pid());
        System.out.println("Is ProcessAlive=="+process.isAlive());
        System.out.println("Command=="+process.info().command());
        System.out.println("ProcessStartTime=="+process.info().startInstant());
        System.out.println("Duration=="+process.info().totalCpuDuration());
        System.out.println("Process User=="+process.info().user());
    }

}

请注意,即使在请求进程终止后, isAlive()方法也可能会返回true一段时间。发生这种情况是因为进程是异步终止的。

这是ProcessHandle接口的文档。 http://download.java.net/java/jdk9/docs/api/java/lang/ProcessHandle.html