热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

用Javascript实现Windows任务管理器

在Windows系统上,自从98系统以来就提供了脚本宿主(WindowsScriptingHost简称WSH)的功能,WSH可以加载并运行JS和VBS脚本,并支持调用系统的COM组件,在COM组件的支持下脚本可以轻松实现非常强大的功能。...SyntaxHighlighter.a

在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('\
    \
      \
        \
      \
      \
   ');
  //等待浏览器加载完毕
    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(''+['序号','PID','名称','操作','CPU占用率','内存占用','路径'].join('')+'');
    foreach(process, function(i, object){
        var tr = [];
        var td = [];
        td.push(i);
        td.push(object.processid);
        td.push(object.name);
        td.push('结束');
        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(''+td.join('')+'');
        table.push(tr);
    });
    table.push('内存占用:'+((~~(memSum*100))/100)+'MB'+',CPU占用率:'+((~~(cpuSum*100))/100)+'%');
    table='

'+table.join('')+'
'
    update(table);
}

//这里要有一个循环,因为WScript进程与浏览器进程是分开的,如果不加循环当程序执行到这里WScript就结束了。
try{
    while(!browser.Closed) { try{refresh();}catch(e){}; WScript.Sleep(1000) };
}catch(e){}

 
运行效果:

  \


 

二.源码下载

/Files/xiao-f/Process.ziphttp://up.2cto.com/2012/0327/20120327093642385.zip
 


 

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

 

摘自  X!ao_f
 
推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
author-avatar
小白学习哈
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有