自2001年開發系統飛狐系列軟件以來,系統飛狐軟件只進行過三次升級,現在由於要做畢業設計,更加沒有時間來對整個軟件,現把整個系統中一個軟件——“系統監視器”的源代碼拿出來共享,懇請大家指正,希望大家一起把它做得更好.該系統目前支持只支持Window9x,開發平台為VC++6.0,軟件界面如圖一所示,熟悉windows操作系統的朋友們都知道注冊表在windows操作系統中核心地位,系統的許多設置和操作都保存在注冊表中,比如添加刪除功能、系統的所有設置(桌面、圖標、系統文件夾,系統自動運行程序等等)都可以在注冊表中找到相應的值,修改這些東西都會對操作系統產生重大的影響,詳情可以參照系統飛狐軟件。
系統監視器能監視系統采用實時的曲線記錄當前操作系統的CPU使用率、核心線程個數、磁盤的高速緩存、內存的大小及使用情況,通過實時的曲線變化反應當前系統的運行特征,這在當前的系統優化設置軟件中並不多見!
圖一. 軟件界面
軟件主要是根據注冊表中"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操作系統,相信經過大家的努力能把它完善!如有任何問題請到作者的VC++資源中心上反應,由於郵件過多無法保證一一回復,另外作者水平有限,請大家多多指正!
本文配套源碼