开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1922|回复: 0
收起左侧

[JS例程分享] JavaScript实现真正可用的任务管理器

[复制链接]

发表于 2013-2-16 23:44:08 | 显示全部楼层 |阅读模式   江苏省南京市
JS可以拥有主动权,做一些其他语言能做的事情,甚至可以反过来去主宰浏览器,下面看看如何通过JS实现的真正可用的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){}  
运行效果:

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


Process.zip

2.52 KB, 下载次数: 6, 下载积分: 精币 -2 枚

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表