JavaScript实现真正可用的任务管理器

开发 前端
JS可以拥有主动权,做一些其他语言能做的事情,甚至可以反过来去主宰浏览器,下面看看如何通过JS实现的真正可用的Windows任务管理器。
在Windows系统上,自从98系统以来就提供了脚本宿主(Windows Scripting Host 简称WSH)的功能,WSH可以加载并运行JS和VBS脚本,并支持调用系统的COM组件,在COM组件的支持下脚本可以轻松实现非常强大的功能。
很多人一提到JS可能就会想到网页,其实JS同样可以拥有主动权,做一些其他语言能做到的事情,甚至可以反过来去主宰浏览器,而不是被浏览器主宰着。
这篇文章将介绍一个建立在WSH平台上,通过JS实现的真正可用的Windows任务管理器。 
 
一:代码及注释 
 
  1. /*  
  2. JS任务管理器  
  3. By:X!ao_f  
  4. Mail:Xiao_f.mail@163.com  
  5. QQ:120000512  
  6. */ 
  7. //建立对象Shell对象,该对象提供了弹出提示框、运行进程、操作注册表等基本功能。  
  8. var shell = WScript.CreateObject("WScript.Shell");  
  9. //建立WMI对象,通过WMI可以实现系统管理,其中就包括了进程管理部分  
  10. var wmi = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".""root\\cimv2");  
  11. //建立一个IE窗口,用于数据的输出  
  12. var browser = WScript.CreateObject("InternetExplorer.Application");  
  13. //微软的公共对话框组件,可以提供打开文件、选择字体、颜色选择功能  
  14. var commonDialog = WScript.CreateObject("MSComDlg.CommonDialog");  
  15. var window;  
  16.  
  17. function foreach(object, fn){  
  18.     var i = 0;  
  19.     for(var e = new Enumerator(object);!e.atEnd();e.moveNext()){  
  20.         fn(i++, e.item());  
  21.     }  
  22. }  
  23.  
  24. //初始化窗口  
  25. ~function(){  
  26.   browser.navigate("about:blank");  
  27.     browser.visible=false 
  28.     browser.document.write('\  
  29.     <HTML>\  
  30.       <head>\  
  31.         <style>\  
  32.           *{font:14px arial;margin:0;padding:3px;}\  
  33.         </style>\  
  34.       </head>\  
  35.       <BODY></BODY>\  
  36.    </HTML>');  
  37.   //等待浏览器加载完毕  
  38.     while(browser.Busy) WScript.Sleep(100);  
  39.     //设置浏览器外观  
  40.     browser.document.title = "进程管理器" 
  41.     browser.toolBar = false;  
  42.     browser.statusBar = false;  
  43.     browser.fullScreen = true;  
  44.     var w = browser.width;  
  45.     var h = browser.height;  
  46.     browser.fullScreen = false;  
  47.     try{  
  48.     browser.width = w;  
  49.     browser.height = h;  
  50.     browser.left = 0;  
  51.     browser.top = 0;  
  52.     }catch(e){}  
  53.     window = browser.document.parentWindow;  
  54.   //创建按钮并绑定事件  
  55.     var button = browser.document.createElement("button");  
  56.     button.innerHTML = "新建进程..";  
  57.     button.onmousedown = open;  
  58.     browser.document.body.appendChild(button);  
  59.  
  60.     var button = browser.document.createElement("button");  
  61.     button.innerHTML = "刷新列表";  
  62.     button.onmousedown = refresh;  
  63.     browser.document.body.appendChild(button);  
  64.       
  65.     var divList = browser.document.createElement("div");  
  66.     divList.id = "divList";  
  67.     browser.document.body.appendChild(divList);  
  68.       
  69.     //结束进程的回调函数  
  70.     browser.document.__kill__ = function(pid){  
  71.         var process = wmi.ExecQuery("Select * From Win32_Process Where ProcessID = '"+pid+"'")  
  72.         foreach(process, function(i, o){  
  73.             o.terminate();  
  74.         });  
  75.     };  
  76.     browser.visible = true 
  77. }()  
  78.  
  79. //更新列表  
  80. function update(msg){  
  81.   browser.document.body.all.divList.innerHTML = msg;  
  82. }  
  83.  
  84. //新建进程  
  85. function open(){  
  86.   //因为第一次弹出对话框会被浏览器窗口挡住,隐藏一下浏览器可以解决这个问题  
  87.   if(!commonDialog.Filter){  
  88.     browser.visible=false 
  89.     browser.visible=true 
  90.   }  
  91.   //这里设置打开对话框的过滤规则  
  92.   commonDialog.Filter = "所有类型 (*.*)";  
  93.   commonDialog.DialogTitle = "进程管理器-选择文件";  
  94.   commonDialog.MaxFileSize = 260;  
  95.   commonDialog.CancelError = false;  
  96.   //通过延迟的方式打开对话框可以保证显示在最前端  
  97.   window.setTimeout(function(){  
  98.     commonDialog.ShowOpen();  
  99.     var path = commonDialog.Filename;  
  100.     //Path不为空可以视为按的确定按钮,用shell执行该路径  
  101.     if(path){  
  102.       shell.run('"' + path + '"');  
  103.       commonDialog.Filename = '';  
  104.       listProcess();  
  105.     }  
  106.   },10);  
  107. }  
  108.  
  109. //刷新  
  110. function refresh(){  
  111.   listProcess();  
  112. }  
  113.  
  114. //处理进程列表的主要函数  
  115. function listProcess(){  
  116.   //这里先通过WMI查询出所有的进程基本信息,有关WMI的使用方法可以查询相关资料,或通过cmd下wmic -?查看帮助信息,在这里不过多介绍。  
  117.     var process = wmi.ExecQuery("Select * from Win32_Process");  
  118.     var p1 = {};  
  119.     var p2 = {};  
  120.     //下面计算CPU占用率,引用:http://www.techish.net/2009/03/get-process-cpu-usage-using-wmi/  
  121.     var data1 = wmi.ExecQuery("select * from Win32_PerfRawData_PerfProc_Process");  
  122.     foreach(data1, function(i, object){  
  123.     p1[object.IDProcess] = object;  
  124.     });  
  125.     WScript.sleep(1000)  
  126.     var data2 = wmi.ExecQuery("select * from Win32_PerfRawData_PerfProc_Process");  
  127.     foreach(data2, function(i, object){  
  128.     p2[object.IDProcess] =    
  129.       (p1[object.IDProcess].PercentProcessorTime - object.PercentProcessorTime)/  
  130.       (p1[object.IDProcess].TimeStamp_Sys100NS - object.TimeStamp_Sys100NS) * 100;  
  131.     });  
  132.     //生成表格并更新  
  133.     var table = [];  
  134.     var memSum = 0;  
  135.     var cpuSum = 0;  
  136.     table.push('<tr><td>'+['序号','PID','名称','操作','CPU占用率','内存占用','路径'].join('</td><td>')+'</td></tr>');  
  137.     foreach(process, function(i, object){  
  138.         var tr = [];  
  139.         var td = [];  
  140.         td.push(i);  
  141.         td.push(object.processid);  
  142.         td.push(object.name);  
  143.         td.push('<span style="color:red;cursor:pointer" onclick="document.__kill__('+object.processid+'); this.parentNode.parentNode.removeNode(true);">结束</span>');  
  144.         td.push((~~(p2[object.ProcessID]*100))/100);  
  145.         td.push((~~((object.WorkingSetSize/1024/1024)*100))/100+'MB');  
  146.         td.push((object.executablepath||'-')+'&nbsp');  
  147.         memSum+=(object.WorkingSetSize/1024/1024);  
  148.         if(object.processid!=0){  
  149.       cpuSum+=p2[object.ProcessID];  
  150.         }  
  151.         tr.push('<tr><td>'+td.join('</td><td>')+'</td></tr>');  
  152.         table.push(tr);  
  153.     });  
  154.     table.push('<tr><td colspan=8>内存占用:'+((~~(memSum*100))/100)+'MB'+',CPU占用率:'+((~~(cpuSum*100))/100)+'%</td></tr>');  
  155.     table='<table width=100% border=1>'+table.join('')+'</table>' 
  156.     update(table);  
  157. }  
  158.  
  159. //这里要有一个循环,因为WScript进程与浏览器进程是分开的,如果不加循环当程序执行到这里WScript就结束了。  
  160. try{  
  161.     while(!browser.Closed) { try{refresh();}catch(e){}; WScript.Sleep(1000) };  
  162. }catch(e){}  
运行效果:

 

二.源码下载

/Files/xiao-f/Process.zip

运行方法:前提是windows操作系统,如果.js的打开方式没有特殊设置过,双击就可以运行了,如果关联过IDE,需要选择打开方式为"Microsoft Windows Based Script Host";

原文地址:http://www.cnblogs.com/xiao-f/archive/2012/03/24/2415407.html

【编辑推荐】

  1. 16个对开发者非常有用的JavaScript库
  2. 深入理解JavaScript:设计模式之组合模式
  3. 深入理解JavaScript:设计模式之适配器模式
  4. 分享5个最佳的JavaScript日期处理类库
  5. JavaScript表格组件加载速度测试

 

责任编辑:张伟 来源: X!ao_f的博客
相关推荐

2020-03-12 18:34:30

Windows 10Windows任务管理器

2011-06-30 09:31:54

Chrome OS

2020-10-12 09:00:00

Firefox任务管理器浏览器

2023-11-24 08:21:08

下载任务管理器

2015-08-18 13:25:12

PaaS服务架构动态扩展

2022-04-13 09:43:50

VoltaJavaScript开发工具

2023-03-03 09:09:55

2021-03-05 14:02:51

LinuxWindows管理器

2022-01-21 07:15:19

微软Windows 11任务管理器

2009-02-18 20:39:34

2011-06-06 09:57:43

任务管理器

2020-08-10 08:26:26

Windows 10Windows微软

2023-11-25 09:31:20

Go事件管理器

2009-12-23 08:50:27

Fedora任务管理器

2009-06-17 08:41:45

Windows 7微软操作系统

2023-12-19 22:48:22

2010-09-10 09:12:49

私有云

2015-08-06 11:25:25

iOS9多任务iCarousel

2012-11-06 13:31:04

Windows 8任务管理器

2022-02-17 15:59:10

Windows 11任务管理器
点赞
收藏

51CTO技术栈公众号