上文

 

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

先介绍一个别人写好的小工具,multiMeter。

grafana监控cpu使用率 电脑上实时监控cpu使用率_grafana监控cpu使用率

grafana监控cpu使用率 电脑上实时监控cpu使用率_Machine_02

比较不错了只是太大了,不适合长期显示在最上面。官方的网址是http://sfkilla.com/。但是小工具是加密的,不太容易看到源码。

 

 

一、CPU使用率

    CPU的使用率很容易实现,win7自带了一个不错的CPU meter,可以直接看源码的。主要的数据来自System.Machine.CPU对象。具体的参考见MSDN,http://msdn.microsoft.com/en-us/library/aa359268(VS.85).aspx。具体的说就是:

 


grafana监控cpu使用率 电脑上实时监控cpu使用率_WMI_03

grafana监控cpu使用率 电脑上实时监控cpu使用率_Machine_04

监视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成功了,或者知道怎么用,麻烦告诉我一下。

 


grafana监控cpu使用率 电脑上实时监控cpu使用率_WMI_03

grafana监控cpu使用率 电脑上实时监控cpu使用率_Machine_04

监视流量

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功能,和按设置读取快捷菜单。