分类: C/C++
2008-03-17 17:25:37
图一. 软件界面
软件主要是根据注册表中"HKEY_DYN_DATA, PerfStats"下面的值的实时的变化获得当前系统的各种特征值,通过VC++定时器对采集这些数据处理后得到当前的变化值。系统的各种主要的参数相对应在注册表中的值如下面的代码所示,不一一详细解说。以CPU使用率和线程的个数的监视原理作为例子跟大家解说一下基本原理,这里用到了比较多的Wins32 API函数.
DWORD dwDataSize; DWORD dwType; // starting the counter if ( RegOpenKeyEx( HKEY_DYN_DATA, "PerfStats\\StartStat", 0, KEY_ALL_ACCESS, &hkey ) != ERROR_SUCCESS ) return FALSE; //CPU使用率的获得 dwDataSize=sizeof(DWORD); RegQueryValueEx( hkey, "KERNEL\\CPUUsage", NULL,&dwType, (LPBYTE)&dwCpuUsage, &dwDataSize ); RegCloseKey(hkey); //线程个数的获得 RegQueryValueEx( hkey, "KERNEL\\Threads", NULL, &dwType, (LPBYTE)&dwThreadUsage, &dwDataSize ); RegCloseKey(hkey); // geting current counter''s value if ( RegOpenKeyEx( HKEY_DYN_DATA, "PerfStats\\StatData", 0,KEY_READ, &hkey ) != ERROR_SUCCESS) return FALSE; dwDataSize=sizeof(DWORD); RegQueryValueEx( hkey, "KERNEL\\CPUUsage", NULL, &dwType, (LPBYTE)&dwCpuUsage, &dwDataSize );//CPU的获得 RegQueryValueEx( hkey, "KERNEL\\Threads", NULL,&dwType, (LPBYTE)&dwThreadUsage, &dwDataSize ); //线程的获得 SetTimer(1,500,NULL); //定时器绘制实时曲线描述当前状态,在OnTimer函数和OnPaint中编制如下代码来求得实时的值然后绘制曲线:
void CCpuPage::OnTimer(UINT nIDEvent) { DWORD dwDataSize; DWORD dwType; dwDataSize=sizeof(DWORD); RegQueryValueEx( hkey, "KERNEL\\CPUUsage", NULL, &dwType, (LPBYTE)&dwCpuUsage, &dwDataSize ); //CPU 的获得 RegQueryValueEx( hkey, "KERNEL\\Threads", NULL, &dwType, (LPBYTE)&dwThreadUsage, &dwDataSize );//线程的获得 UpdateData(FALSE); Invalidate(FALSE); CPropertyPage::OnTimer(nIDEvent); } void CCpuPage::OnPaint() { CPaintDC dc(this); // device context for painting for( i=0; i<50;i++)//画历史图 { m_CPUData[i]=m_CPUData[i+1];//历史值 } m_CPUData[49]=n*3; dc.MoveTo(146,94-m_CPUData[0]);绘制曲线 for( i=1; i<50;i++) { dc.LineTo(146+4.7*i,94-m_CPUData[i]/1.2); dc.SelectObject(pOldPen); }
图二 图形界面
结束语
系统监视器的核心主要是通过对注册表的操作进行系统的检测,上面的介绍清楚的说明了注册表记录操作系统的各种运行参数,我们要做的就是找到这些参数对应的注册表值,然后根据对这些值的变化来得到当前的系统状态,由于作者时间有限,没有对软件的使用平台进行扩展目前只支持Win9x操作系统,相信经过大家的努力能把它完善!如有任何问题请到作者的上反应,由于邮件过多无法保证一一回复,另外作者水平有限,请大家多多指正!