接上文。
上次学习了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功能,和按设置读取快捷菜单。