且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

C/C++获取Windows系统CPU和内存及硬盘使用情况

更新时间:2022-06-29 17:20:37

//1.获取Windows系统内存使用率

 

[cpp] view plain copy
 
  1. //windows 内存 使用率  
  2. DWORD getWin_MemUsage(){  
  3.     MEMORYSTATUS ms;  
  4.     ::GlobalMemoryStatus(&ms);  
  5.     return ms.dwMemoryLoad;  
  6. }  

 

 

//2.获取windowsCPU使用率

 

[cpp] view plain copy
 
  1. __int64 CompareFileTime(FILETIME time1, FILETIME time2)  
  2. {  
  3.     __int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime;  
  4.     __int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime;  
  5.   
  6.     return (b - a);  
  7. }  
  8. //WIN CPU使用情况  
  9. void getWin_CpuUsage(){  
  10.     HANDLE hEvent;  
  11.     BOOL res;  
  12.     FILETIME preidleTime;  
  13.     FILETIME prekernelTime;  
  14.     FILETIME preuserTime;  
  15.     FILETIME idleTime;  
  16.     FILETIME kernelTime;  
  17.     FILETIME userTime;  
  18.   
  19.     res = GetSystemTimes(&idleTime, &kernelTime, &userTime);  
  20.     preidleTime = idleTime;  
  21.     prekernelTime = kernelTime;  
  22.     preuserTime = userTime;  
  23.   
  24.     hEvent = CreateEventA(NULL, FALSE, FALSE, NULL); // 初始值为 nonsignaled ,并且每次触发后自动设置为nonsignaled  
  25.   
  26.     while (true){  
  27.         WaitForSingleObject(hEvent, 1000);  
  28.         res = GetSystemTimes(&idleTime, &kernelTime, &userTime);  
  29.   
  30.         __int64 idle = CompareFileTime(preidleTime, idleTime);  
  31.         __int64 kernel = CompareFileTime(prekernelTime, kernelTime);  
  32.         __int64 user = CompareFileTime(preuserTime, userTime);  
  33.   
  34.         __int64 cpu = (kernel + user - idle) * 100 / (kernel + user);  
  35.         __int64 cpuidle = (idle)* 100 / (kernel + user);  
  36.         cout << "CPU利用率:" << cpu << "%" << " CPU空闲率:" << cpuidle << "%" << endl;  
  37.   
  38.         preidleTime = idleTime;  
  39.         prekernelTime = kernelTime;  
  40.         preuserTime = userTime;  
  41.     }  
  42. }  
[cpp] view plain copy
 
  1. //获取 WIN 硬盘使用情况  
  2. int getWin_DiskUsage(){  
  3.     int DiskCount = 0;  
  4.     DWORD DiskInfo = GetLogicalDrives();  
  5.     //利用GetLogicalDrives()函数可以获取系统中逻辑驱动器的数量,函数返回的是一个32位无符号整型数据。    
  6.     while (DiskInfo)//通过循环操作查看每一位数据是否为1,如果为1则磁盘为真,如果为0则磁盘不存在。    
  7.     {  
  8.         if (DiskInfo & 1)//通过位运算的逻辑与操作,判断是否为1    
  9.         {  
  10.             ++DiskCount;  
  11.         }  
  12.         DiskInfo = DiskInfo >> 1;//通过位运算的右移操作保证每循环一次所检查的位置向右移动一位。    
  13.         //DiskInfo = DiskInfo/2;    
  14.     }  
  15.     cout << "Logical Disk Number:" << DiskCount << endl;  
  16.     //-----------------------------------------------------------------------------------------  
  17.     int DSLength = GetLogicalDriveStrings(0, NULL);  
  18.     //通过GetLogicalDriveStrings()函数获取所有驱动器字符串信息长度。    
  19.     char* DStr = new char[DSLength];//用获取的长度在堆区创建一个c风格的字符串数组    
  20.     GetLogicalDriveStrings(DSLength, (LPTSTR)DStr);  
  21.     //通过GetLogicalDriveStrings将字符串信息复制到堆区数组中,其中保存了所有驱动器的信息。    
  22.   
  23.     int DType;  
  24.     int si = 0;  
  25.     BOOL fResult;  
  26.     unsigned _int64 i64FreeBytesToCaller;  
  27.     unsigned _int64 i64TotalBytes;  
  28.     unsigned _int64 i64FreeBytes;  
  29.   
  30.     for (int i = 0; i<DSLength / 4; ++i)//为了显示每个驱动器的状态,则通过循环输出实现,由于DStr内部保存的数据是A:\NULLB:\NULLC:\NULL,这样的信息,所以DSLength/4可以获得具体大循环范围    
  31.     {  
  32.         char dir[3] = { DStr[si], ':', '\\' };  
  33.         cout << dir;  
  34.         DType = GetDriveType(DStr + i * 4);  
  35.         //GetDriveType函数,可以获取驱动器类型,参数为驱动器的根目录    
  36.         if (DType == DRIVE_FIXED)  
  37.         {  
  38.             cout << "Hard Disk";  
  39.         }  
  40.         else if (DType == DRIVE_CDROM)  
  41.         {  
  42.             cout << "CD-ROM";  
  43.         }  
  44.         else if (DType == DRIVE_REMOVABLE)  
  45.         {  
  46.             cout << "Removable Disk";  
  47.         }  
  48.         else if (DType == DRIVE_REMOTE)  
  49.         {  
  50.             cout << "Network Disk";  
  51.         }  
  52.         else if (DType == DRIVE_RAMDISK)  
  53.         {  
  54.             cout << "Virtual RAM Disk";  
  55.         }  
  56.         else if (DType == DRIVE_UNKNOWN)  
  57.         {  
  58.             cout << "Unknown Device";  
  59.         }  
  60.   
  61.         fResult = GetDiskFreeSpaceEx(  
  62.             dir,  
  63.             (PULARGE_INTEGER)&i64FreeBytesToCaller,  
  64.             (PULARGE_INTEGER)&i64TotalBytes,  
  65.             (PULARGE_INTEGER)&i64FreeBytes);  
  66.         //GetDiskFreeSpaceEx函数,可以获取驱动器磁盘的空间状态,函数返回的是个BOOL类型数据    
  67.         if (fResult)//通过返回的BOOL数据判断驱动器是否在工作状态    
  68.         {  
  69.             cout << " totalspace:" << (float)i64TotalBytes / 1024 / 1024 << " MB";//磁盘总容量    
  70.             cout << " freespace:" << (float)i64FreeBytesToCaller / 1024 / 1024 << " MB";//磁盘剩余空间    
  71.         }  
  72.         else  
  73.         {  
  74.             cout << " 设备未准备好";  
  75.         }  
  76.         cout << endl;  
  77.         si += 4;  
  78.     }  
  79.     return 0;  
  80. }  

 

//main函数

 

[cpp] view plain copy
 
    1. int main( int argc, char **argv )  
    2. {  
    3.     //+++======================获取windows 内存使用率==================+++//  
    4.     DWORD dwValue = getWin_MemUsage();  
    5.     printf("内存使用率为 %d %% \n",dwValue);  
    6.     //+++======================获取Windows CPU使用率====================+++//  
    7.     //getWin_CpuUsage();  
    8.     //+++======================获取Windows 硬盘使用====================+++//  
    9.     getWin_DiskUsage();  
    10.         return 0;  
    11. }