用Javascript实现Windows任务管理器

东坡下载 2012年03月24日 16:52:14

      在Windows系统上,自从98系统以来就提供了脚本宿主(Windows Scripting Host 简称WSH)的功能,WSH可以加载并运行JS和VBS脚本,并支持调用系统的COM组件,在COM组件的支持下脚本可以轻松实现非常强大的功能。

      很多人一提到JS可能就会想到网页,其实JS同样可以拥有主动权,做一些其他语言能做到的事情,甚至可以反过来去主宰浏览器,而不是被浏览器主宰着。

      这篇文章将介绍一个建立在WSH平台上,通过JS实现的真正可用的Windows任务管理器。

      一:代码及注释

      /*

      JS任务管理器

      By:X!ao_f

      Mail:Xiao_f.mail@163.com

      QQ:120000512

      */

      //建立对象Shell对象,该对象提供了弹出提示框、运行进程、操作注册表等基本功能。

      var shell = WScript.CreateObject("WScript.Shell");

      //建立WMI对象,通过WMI可以实现系统管理,其中就包括了进程管理部分

      var wmi = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\\cimv2");

      //建立一个IE窗口,用于数据的输出

      var browser = WScript.CreateObject("InternetExplorer.Application");

      //微软的公共对话框组件,可以提供打开文件、选择字体、颜色选择功能

      var commonDialog = WScript.CreateObject("MSComDlg.CommonDialog");

      var window;

      function foreach(object, fn){

      var i = 0;

      for(var e = new Enumerator(object);!e.atEnd();e.moveNext()){

      fn(i++, e.item());

      }

      }

      //初始化窗口

      ~function(){

      browser.navigate("about:blank");

      browser.visible=false

      browser.document.write('\

      \

      \

      \

      \

      \

      ');

      //等待浏览器加载完毕

      while(browser.Busy) WScript.Sleep(100);

      //设置浏览器外观

      browser.document.title = "进程管理器"

      browser.toolBar = false;

      browser.statusBar = false;

      browser.fullScreen = true;

      var w = browser.width;

      var h = browser.height;

      browser.fullScreen = false;

      browser.width = w;

      browser.height = h;

      browser.left = 0;

      browser.top = 0;

      window = browser.document.parentWindow;

      //创建按钮并绑定事件

      var button = browser.document.createElement("button");

      button.innerHTML = "新建进程..";

      button.onmousedown = open;

      browser.document.body.appendChild(button);

      var button = browser.document.createElement("button");

      button.innerHTML = "刷新列表";

      button.onmousedown = refresh;

      browser.document.body.appendChild(button);

      var divList = browser.document.createElement("div");

      divList.id = "divList";

      browser.document.body.appendChild(divList);

      //结束进程的回调函数

      browser.document.__kill__ = function(pid){

      var process = wmi.ExecQuery("Select * From Win32_Process Where ProcessID = '"+pid+"'")

      foreach(process, function(i, o){

      o.terminate();

      });

      };

      browser.visible = true

      }()

      //更新列表

      function update(msg){

      browser.document.body.all.divList.innerHTML = msg;

      }

      //新建进程

      function open(){

      //因为第一次弹出对话框会被浏览器窗口挡住,隐藏一下浏览器可以解决这个问题

      if(!commonDialog.Filter){

      browser.visible=false

      browser.visible=true

      }

      //这里设置打开对话框的过滤规则

      commonDialog.Filter = "所有类型 (*.*)";

      commonDialog.DialogTitle = "进程管理器-选择文件";

      commonDialog.MaxFileSize = 260;

      commonDialog.CancelError = false;

      //通过延迟的方式打开对话框可以保证显示在最前端

      window.setTimeout(function(){

      commonDialog.ShowOpen();

      var path = commonDialog.Filename;

      //Path不为空可以视为按的确定按钮,用shell执行该路径

      if(path){

      shell.run('"' + path + '"');

      commonDialog.Filename = '';

      listProcess();

      }

      },10);

      }

      //刷新

      function refresh(){

      listProcess();

      }

      //处理进程列表的主要函数

      function listProcess(){

      //这里先通过WMI查询出所有的进程基本信息,有关WMI的使用方法可以查询相关资料,或通过cmd下wmic -?查看帮助信息,在这里不过多介绍。

      var process = wmi.ExecQuery("Select * from Win32_Process");

      var p1 = {};

      var p2 = {};

      //下面计算CPU占用率,引用:http://www.techish.net/2009/03/get-process-cpu-usage-using-wmi/

      var data1 = wmi.ExecQuery("select * from Win32_PerfRawData_PerfProc_Process");

      foreach(data1, function(i, object){

      p1[object.IDProcess] = object;

      });

      WScript.sleep(1000)

      var data2 = wmi.ExecQuery("select * from Win32_PerfRawData_PerfProc_Process");

      foreach(data2, function(i, object){

      p2[object.IDProcess] =

      (p1[object.IDProcess].PercentProcessorTime - object.PercentProcessorTime)/

      (p1[object.IDProcess].TimeStamp_Sys100NS - object.TimeStamp_Sys100NS) * 100;

      });

      //生成表格并更新

      var table = [];

      var memSum = 0;

      var cpuSum = 0;

      table.push(''+['序号','PID','名称','操作','CPU占用率','内存占用','路径'].join('')+'');

      foreach(process, function(i, object){

      var tr = [];

      var td = [];

      td.push(i);

      td.push(object.processid);

      td.push(object.name);

      td.push('结束');

      td.push((~~(p2[object.ProcessID]*100))/100);

      td.push((~~((object.WorkingSetSize/1024/1024)*100))/100+'MB');

      td.push((object.executablepath||'-')+' ');

      memSum+=(object.WorkingSetSize/1024/1024);

      if(object.processid!=0){

      cpuSum+=p2[object.ProcessID];

      }

      tr.push(''+td.join('')+'');

      table.push(tr);

      });

      table.push('内存占用:'+((~~(memSum*100))/100)+'MB'+',CPU占用率:'+((~~(cpuSum*100))/100)+'%');

      table=''

      update(table);

      }

      //这里要有一个循环,因为WScript进程与浏览器进程是分开的,如果不加循环当程序执行到这里WScript就结束了。

      try{

      while(!browser.Closed) { try{refresh();}catch(e){}; WScript.Sleep(1000) };

      }catch(e){}