使用Java程序进行进程检测这种方式使用的情况很少,遇到了就做一个记录
网上提供的方式比较多,但是我觉的可用的就以下两种,但是本质上是一样的
第一种方式:
public static boolean isRunning() throws Exception { String ls_1 = ""; Process process = Runtime.getRuntime().exec("TASKLIST /NH /FI \"IMAGENAME eq demo.exe\""); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); while ((ls_1 = bufferedReader.readLine()) != null) { if (ls_1.startsWith("demo.exe")) {//根据进程名字判断 //说明该进程存在 System.out.println("应用已经打开"); return true; } } process.waitFor(); process.destroy(); return false; }
第二种方式:
/** * 检测程序。 * * @param processName 线程的名字,请使用准确的名字 * @return 找到返回true, 没找到返回false */ public static boolean findProcess(String processName) { BufferedReader bufferedReader = null; try { Process proc = Runtime.getRuntime().exec("TASKLIST /NH /FI \"IMAGENAME eq " + processName + "\""); bufferedReader = new BufferedReader(new InputStreamReader(proc.getInputStream())); String line = null; while ((line = bufferedReader.readLine()) != null) { System.out.println(line); if (line.contains(processName)) { return true; } } return false; } catch (Exception ex) { ex.printStackTrace(); return false; } finally { if (bufferedReader != null) { try { bufferedReader.close(); } catch (Exception ex) { } } } }
上面两种方式都是通过获取进程数据信息进行比较,而且有一个小问题就是使用boolean在本程序检测,会出现一个问题就是一直返回true,因为它把自己的启动也检测了,
所以进行一个简单的修改使用数字判断是否已经启动过本程序应用
public static int isRunning() throws Exception { String ls_1 = ""; int startTimes = 0; Process process = Runtime.getRuntime().exec("TASKLIST /NH /FI \"IMAGENAME eq demo.exe\""); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); while ((ls_1 = bufferedReader.readLine()) != null) { if (ls_1.startsWith("demo.exe")) {//根据进程名字判断 //说明该进程存在 startTimes++; } } process.waitFor(); process.destroy(); return startTimes; }