JavaScript實(shí)現(xiàn)真正可用的任務(wù)管理器
作者:X!ao_f
JS可以擁有主動(dòng)權(quán),做一些其他語言能做的事情,甚至可以反過來去主宰瀏覽器,下面看看如何通過JS實(shí)現(xiàn)的真正可用的Windows任務(wù)管理器。
在Windows系統(tǒng)上,自從98系統(tǒng)以來就提供了腳本宿主(Windows Scripting Host 簡稱WSH)的功能,WSH可以加載并運(yùn)行JS和VBS腳本,并支持調(diào)用系統(tǒng)的COM組件,在COM組件的支持下腳本可以輕松實(shí)現(xiàn)非常強(qiáng)大的功能。
很多人一提到JS可能就會(huì)想到網(wǎng)頁,其實(shí)JS同樣可以擁有主動(dòng)權(quán),做一些其他語言能做到的事情,甚至可以反過來去主宰瀏覽器,而不是被瀏覽器主宰著。
這篇文章將介紹一個(gè)建立在WSH平臺(tái)上,通過JS實(shí)現(xiàn)的真正可用的Windows任務(wù)管理器。
一:代碼及注釋
- /*
- JS任務(wù)管理器
- By:X!ao_f
- Mail:Xiao_f.mail@163.com
- QQ:120000512
- */
- //建立對(duì)象Shell對(duì)象,該對(duì)象提供了彈出提示框、運(yùn)行進(jìn)程、操作注冊表等基本功能。
- var shell = WScript.CreateObject("WScript.Shell");
- //建立WMI對(duì)象,通過WMI可以實(shí)現(xiàn)系統(tǒng)管理,其中就包括了進(jìn)程管理部分
- var wmi = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\\cimv2");
- //建立一個(gè)IE窗口,用于數(shù)據(jù)的輸出
- var browser = WScript.CreateObject("InternetExplorer.Application");
- //微軟的公共對(duì)話框組件,可以提供打開文件、選擇字體、顏色選擇功能
- 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);
- //設(shè)置瀏覽器外觀
- browser.document.title = "進(jìn)程管理器"
- 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;
- //創(chuàng)建按鈕并綁定事件
- var button = browser.document.createElement("button");
- button.innerHTML = "新建進(jìn)程..";
- 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);
- //結(jié)束進(jìn)程的回調(diào)函數(shù)
- 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;
- }
- //新建進(jìn)程
- function open(){
- //因?yàn)榈谝淮螐棾鰧?duì)話框會(huì)被瀏覽器窗口擋住,隱藏一下瀏覽器可以解決這個(gè)問題
- if(!commonDialog.Filter){
- browser.visible=false
- browser.visible=true
- }
- //這里設(shè)置打開對(duì)話框的過濾規(guī)則
- commonDialog.Filter = "所有類型 (*.*)";
- commonDialog.DialogTitle = "進(jìn)程管理器-選擇文件";
- commonDialog.MaxFileSize = 260;
- commonDialog.CancelError = false;
- //通過延遲的方式打開對(duì)話框可以保證顯示在最前端
- window.setTimeout(function(){
- commonDialog.ShowOpen();
- var path = commonDialog.Filename;
- //Path不為空可以視為按的確定按鈕,用shell執(zhí)行該路徑
- if(path){
- shell.run('"' + path + '"');
- commonDialog.Filename = '';
- listProcess();
- }
- },10);
- }
- //刷新
- function refresh(){
- listProcess();
- }
- //處理進(jìn)程列表的主要函數(shù)
- function listProcess(){
- //這里先通過WMI查詢出所有的進(jìn)程基本信息,有關(guān)WMI的使用方法可以查詢相關(guān)資料,或通過cmd下wmic -?查看幫助信息,在這里不過多介紹。
- var process = wmi.ExecQuery("Select * from Win32_Process");
- var p1 = {};
- var p2 = {};
- //下面計(jì)算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>'+['序號(hào)','PID','名稱','操作','CPU占用率','內(nèi)存占用','路徑'].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);">結(jié)束</span>');
- 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('<tr><td>'+td.join('</td><td>')+'</td></tr>');
- table.push(tr);
- });
- table.push('<tr><td colspan=8>內(nèi)存占用:'+((~~(memSum*100))/100)+'MB'+',CPU占用率:'+((~~(cpuSum*100))/100)+'%</td></tr>');
- table='<table width=100% border=1>'+table.join('')+'</table>'
- update(table);
- }
- //這里要有一個(gè)循環(huán),因?yàn)閃Script進(jìn)程與瀏覽器進(jìn)程是分開的,如果不加循環(huán)當(dāng)程序執(zhí)行到這里WScript就結(jié)束了。
- try{
- while(!browser.Closed) { try{refresh();}catch(e){}; WScript.Sleep(1000) };
- }catch(e){}
運(yùn)行效果:
二.源碼下載
運(yùn)行方法:前提是windows操作系統(tǒng),如果.js的打開方式?jīng)]有特殊設(shè)置過,雙擊就可以運(yùn)行了,如果關(guān)聯(lián)過IDE,需要選擇打開方式為"Microsoft Windows Based Script Host";
原文地址:http://www.cnblogs.com/xiao-f/archive/2012/03/24/2415407.html
【編輯推薦】
- 16個(gè)對(duì)開發(fā)者非常有用的JavaScript庫
- 深入理解JavaScript:設(shè)計(jì)模式之組合模式
- 深入理解JavaScript:設(shè)計(jì)模式之適配器模式
- 分享5個(gè)最佳的JavaScript日期處理類庫
- JavaScript表格組件加載速度測試
責(zé)任編輯:張偉
來源:
X!ao_f的博客