昊漫玉 发表于 2015-5-15 05:34:38

自己的Win7小工具(二)———WMI实现实时流量显示

  接上文。
  
  上次学习了Win7小工具基本结构,实现了实时刷新随机数。这次要做一个真正可以用的东西,显示CPU使用率和网卡实时流量。
  先介绍一个别人写好的小工具,multiMeter。

  比较不错了只是太大了,不适合长期显示在最上面。官方的网址是http://sfkilla.com/。但是小工具是加密的,不太容易看到源码。
  
  
  一、CPU使用率
  CPU的使用率很容易实现,win7自带了一个不错的CPU meter,可以直接看源码的。主要的数据来自System.Machine.CPU对象。具体的参考见MSDN,http://msdn.microsoft.com/en-us/library/aa359268(VS.85).aspx。具体的说就是:
  


监视CPU



    CPUCount = System.Machine.CPUs.count;
    var usageTotal = 0;
    for (var i = 0; i < this.CPUCount; i++)
    {
      usageTotal += System.Machine.CPUs.item(i).usagePercentage;
    }
    CPUUsagePercentage = Math.min(Math.max(0, usageTotal / this.CPUCount), 100).toFixed(2).toString() + " %";
  
这个可能是微软觉得比较在gadget里有用,所以内部就有方法实现。
  
  
  二、网卡流量
  某软件的流量监控很受部分人欢迎,确实在桌面上实现准确的流量监控是很方便的。但是实现这个功能还是相当复杂的,好像涉及到复杂的内核编程,而且是不同系统还是有区别的。在网上发现了用WMI也可以监控流量,虽然可能比真正的落后一点,可能不是很准。不过完全够用了。完全参考见MSDN,http://msdn.microsoft.com/en-us/library/aa394340(VS.85).aspx.
  网上一些办法是错误的,无法实现实时刷新。这里我用的方法是WbemScripting.SWbemRefresher另外在JS中我直接GetObject没有成功,不知道为什么,于是用的是WbemScripting.SWbemLocator。如果谁用getObject成功了,或者知道怎么用,麻烦告诉我一下。
  


监视流量



refresher = new ActiveXObject("WbemScripting.SWbemRefresher");    //实现刷新的基础
wmi = new ActiveXObject("WbemScripting.SWbemLocator");    //用于连接wmi
cimv2 = wmi.ConnectServer(".","root\\CIMV2");//圆点.代表本机
objWMIService = wmi.ConnectServer(".","root\\WMI");
objRefreshableItem = refresher.AddEnum(cimv2 ,"Win32_PerfRawData_Tcpip_NetworkInterface");    //向刷新器添加枚举


//其他函数略,关键更新
function update(){
try{
    var nowbyte = 0;
    refresher.Refresh();
    var e = new Enumerator(objRefreshableItem.ObjectSet); //这里不能for……in,要这样用Enumerator
    while(!e.atEnd()){
      nowbyte += e.item().BytesTotalPerSec;
      e.moveNext();
    }
    write("left" , ((nowbyte-lastbyte)/1024/REFRESH_INTERVAL).toFixed(2).toString() + " KB/s"); //write函数是自己写的,不过是写某个span的内容
    //REFRESH_INTERVAL是自己设的常数,lastbyte是全局变量。
    lastbyte = nowbyte ;
    clearTimeout(gadgetTimeout);
    gadgetTimeout = setTimeout("update()", REFRESH_INTERVAL);
}
catch{
    write("debuger", "bug" + err.description);
}

  
这里一开始,我不知道JS里用WMI必须用Enumerator,以为和VBS一样,For Each就可以了。还有,Sidebar的调试很不好办,MSDN上有一篇文章,回来看一看。
  
  最后,设置一下背景,基本上可以初步试用了。
  
  看上去还凑合,呵呵

  
  就这么多了,还是比较有成就感的。下一次,要实现一个简易快速cmd功能,和按设置读取快捷菜单。
页: [1]
查看完整版本: 自己的Win7小工具(二)———WMI实现实时流量显示