用Javascript实现Windows任务管理器的代码

所属分类: 网络编程 / JavaScript 阅读数: 1870
收藏 0 赞 0 分享
很多人一提到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;
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('<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){}

运行效果:

二.源码下载
Process.rar
运行方法:前提是windows操作系统,如果.js的打开方式没有特殊设置过,双击就可以运行了,如果关联过IDE,需要选择打开方式为"Microsoft Windows Based Script Host";
更多精彩内容其他人还在看

jQuery LigerUI 使用教程表格篇(1)

ligerGrid是ligerui系列插件的核心控件,用户可以快速地创建一个美观,而且功能强大的表格,支持排序、分页、多表头、固定列等等
收藏 0 赞 0 分享

JavaScript中常用的运算符小结

JavaScript中常用的运算符小结,需要的朋友可以参考下。
收藏 0 赞 0 分享

深入理解JavaScript系列(13) This? Yes,this!

在这篇文章里,我们将讨论跟执行上下文直接相关的更多细节。讨论的主题就是this关键字。实践证明,这个主题很难,在不同执行上下文中this的确定经常会发生问题
收藏 0 赞 0 分享

javascript (用setTimeout而非setInterval)

javascript (用setTimeout而非setInterval)如果用setInterval 可能出现 下次调用会在前一次调用前调用
收藏 0 赞 0 分享

JavaScript中两个感叹号的作用说明

用两个感叹号的作用就在于,如果明确设置了o中flag的值(非null/undefined/0""/等值),自然test就会取跟o.flag一样的值;如果没有设置,test就会默认为false,而不是null或undefined
收藏 0 赞 0 分享

javascript写的简单的计算器,内容很多,方法实用,推荐

最近用javascript写了一个简单的计算器,自己测试感觉还好,代码都给了注释,非常不错,推荐大家学习。
收藏 0 赞 0 分享

js的表单操作 简单计算器

javascript写的简单的加减乘除计算器,里面涉及到一些方法还是很实用的哦,新手不要错过
收藏 0 赞 0 分享

Jquery中删除元素的实现代码

empty用来删除指定元素的子元素,remove用来删除元素,或者设定细化条件执行删除
收藏 0 赞 0 分享

javaScript 利用闭包模拟对象的私有属性

JavaScript缺少块级作用域,没有private修饰符,但它具有函数作用域。作用域的好处是内部函数可以访问它们的外部函数的参数和变量(除了this和argument
收藏 0 赞 0 分享

为JavaScript类型增加方法的实现代码(增加功能)

大家在js开发过程中有些功能已经满足不了我们的需求,或没有我们需要的功能,那么我们就可以自己扩展下,个性化js
收藏 0 赞 0 分享
查看更多