自己的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。具体的说就是:
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功能,和按设置读取快捷菜单。