C/C++獲取Windows系統CPU和記憶體及硬碟使用情況
阿新 • • 發佈:2018-12-31
//1.獲取Windows系統記憶體使用率
//windows 記憶體 使用率
DWORD getWin_MemUsage(){
MEMORYSTATUS ms;
::GlobalMemoryStatus(&ms);
return ms.dwMemoryLoad;
}
//2.獲取windowsCPU使用率
__int64 CompareFileTime(FILETIME time1, FILETIME time2) { __int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime; __int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime; return (b - a); } //WIN CPU使用情況 void getWin_CpuUsage(){ HANDLE hEvent; BOOL res; FILETIME preidleTime; FILETIME prekernelTime; FILETIME preuserTime; FILETIME idleTime; FILETIME kernelTime; FILETIME userTime; res = GetSystemTimes(&idleTime, &kernelTime, &userTime); preidleTime = idleTime; prekernelTime = kernelTime; preuserTime = userTime; hEvent = CreateEventA(NULL, FALSE, FALSE, NULL); // 初始值為 nonsignaled ,並且每次觸發後自動設定為nonsignaled while (true){ WaitForSingleObject(hEvent, 1000); res = GetSystemTimes(&idleTime, &kernelTime, &userTime); __int64 idle = CompareFileTime(preidleTime, idleTime); __int64 kernel = CompareFileTime(prekernelTime, kernelTime); __int64 user = CompareFileTime(preuserTime, userTime); __int64 cpu = (kernel + user - idle) * 100 / (kernel + user); __int64 cpuidle = (idle)* 100 / (kernel + user); cout << "CPU利用率:" << cpu << "%" << " CPU空閒率:" << cpuidle << "%" << endl; preidleTime = idleTime; prekernelTime = kernelTime; preuserTime = userTime; } }
//獲取 WIN 硬碟使用情況 int getWin_DiskUsage(){ int DiskCount = 0; DWORD DiskInfo = GetLogicalDrives(); //利用GetLogicalDrives()函式可以獲取系統中邏輯驅動器的數量,函式返回的是一個32位無符號整型資料。 while (DiskInfo)//通過迴圈操作檢視每一位資料是否為1,如果為1則磁碟為真,如果為0則磁碟不存在。 { if (DiskInfo & 1)//通過位運算的邏輯與操作,判斷是否為1 { ++DiskCount; } DiskInfo = DiskInfo >> 1;//通過位運算的右移操作保證每迴圈一次所檢查的位置向右移動一位。 //DiskInfo = DiskInfo/2; } cout << "Logical Disk Number:" << DiskCount << endl; //----------------------------------------------------------------------------------------- int DSLength = GetLogicalDriveStrings(0, NULL); //通過GetLogicalDriveStrings()函式獲取所有驅動器字串資訊長度。 char* DStr = new char[DSLength];//用獲取的長度在堆區建立一個c風格的字串陣列 GetLogicalDriveStrings(DSLength, (LPTSTR)DStr); //通過GetLogicalDriveStrings將字串資訊複製到堆區陣列中,其中儲存了所有驅動器的資訊。 int DType; int si = 0; BOOL fResult; unsigned _int64 i64FreeBytesToCaller; unsigned _int64 i64TotalBytes; unsigned _int64 i64FreeBytes; for (int i = 0; i<DSLength / 4; ++i)//為了顯示每個驅動器的狀態,則通過迴圈輸出實現,由於DStr內部儲存的資料是A:\NULLB:\NULLC:\NULL,這樣的資訊,所以DSLength/4可以獲得具體大迴圈範圍 { char dir[3] = { DStr[si], ':', '\\' }; cout << dir; DType = GetDriveType(DStr + i * 4); //GetDriveType函式,可以獲取驅動器型別,引數為驅動器的根目錄 if (DType == DRIVE_FIXED) { cout << "Hard Disk"; } else if (DType == DRIVE_CDROM) { cout << "CD-ROM"; } else if (DType == DRIVE_REMOVABLE) { cout << "Removable Disk"; } else if (DType == DRIVE_REMOTE) { cout << "Network Disk"; } else if (DType == DRIVE_RAMDISK) { cout << "Virtual RAM Disk"; } else if (DType == DRIVE_UNKNOWN) { cout << "Unknown Device"; } fResult = GetDiskFreeSpaceEx( dir, (PULARGE_INTEGER)&i64FreeBytesToCaller, (PULARGE_INTEGER)&i64TotalBytes, (PULARGE_INTEGER)&i64FreeBytes); //GetDiskFreeSpaceEx函式,可以獲取驅動器磁碟的空間狀態,函式返回的是個BOOL型別資料 if (fResult)//通過返回的BOOL資料判斷驅動器是否在工作狀態 { cout << " totalspace:" << (float)i64TotalBytes / 1024 / 1024 << " MB";//磁碟總容量 cout << " freespace:" << (float)i64FreeBytesToCaller / 1024 / 1024 << " MB";//磁碟剩餘空間 } else { cout << " 裝置未準備好"; } cout << endl; si += 4; } return 0; }
//main函式
int main( int argc, char **argv ) { //+++======================獲取windows 記憶體使用率==================+++// DWORD dwValue = getWin_MemUsage(); printf("記憶體使用率為 %d %% \n",dwValue); //+++======================獲取Windows CPU使用率====================+++// //getWin_CpuUsage(); //+++======================獲取Windows 硬碟使用====================+++// getWin_DiskUsage(); return 0; }