用Javascript實現Windows任務管理器


在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('\
    <HTML>\
      <head>\
        <style>\
          *{font:14px arial;margin:0;padding:3px;}\
        </style>\
      </head>\
      <BODY></BODY>\
   </HTML>');
   // 等待瀏覽器加載完畢
     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;
    try{
    browser.width = w;
    browser.height = h;
    browser.left = 0;
    browser.top = 0;
    }catch(e){}
    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('<tr><td>'+['序號','PID','名稱','操作','CPU占用率','內存占用','路徑'].join('</td><td>')+'</td></tr>');
    foreach(process,  function(i, object){
         var tr = [];
         var td = [];
        td.push(i);
        td.push(object.processid);
        td.push(object.name);
        td.push('<span style="color:red;cursor:pointer" onclick="document.__kill__('+object.processid+'); this.parentNode.parentNode.removeNode(true);">結束</span>');
        td.push((~~(p2[object.ProcessID]*100))/100);
        td.push((~~((object.WorkingSetSize/1024/1024)*100))/100+'MB');
        td.push((object.executablepath||'-')+'&nbsp');
        memSum+=(object.WorkingSetSize/1024/1024);
         if(object.processid!=0){
      cpuSum+=p2[object.ProcessID];
        }
        tr.push('<tr><td>'+td.join('</td><td>')+'</td></tr>');
        table.push(tr);
    });
    table.push('<tr><td colspan=8>內存占用:'+((~~(memSum*100))/100)+'MB'+',CPU占用率:'+((~~(cpuSum*100))/100)+'%</td></tr>');
    table='<table width=100% border=1>'+table.join('')+'</table>'
    update(table);
}

// 這里要有一個循環,因為WScript進程與瀏覽器進程是分開的,如果不加循環當程序執行到這里WScript就結束了。
try{
     while(!browser.Closed) {  try{refresh();} catch(e){}; WScript.Sleep(1000) };
} catch(e){}

 

運行效果:

 

 

二.源碼下載

/Files/xiao-f/Process.zip

 

運行方法:前提是windows操作系統,如果.js的打開方式沒有特殊設置過,雙擊就可以運行了,如果關聯過IDE,需要選擇打開方式為"Microsoft Windows Based Script Host";

 

2012年3月27日 更新:

有幾位朋友反應電腦報錯的情況,經過測試,可能是由於IE控件相關的注冊表數據被修改,造成了控件創建異常(尤其在安裝了360瀏覽器的機器上)。

將部分設置的選項try一下,就可以運行了。新的代碼如下:

/Files/xiao-f/Process.zip

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM