zoukankan      html  css  js  c++  java
  • C/C++获取Windows系统CPU和内存及硬盘使用情况

    //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 %%  ",dwValue);  
      6.     //+++======================获取Windows CPU使用率====================+++//  
      7.     //getWin_CpuUsage();  
      8.     //+++======================获取Windows 硬盘使用====================+++//  
      9.     getWin_DiskUsage();  
      10.         return 0;  
      11. }  
  • 相关阅读:
    这些简单优化能让你的Win10流畅很多
    win7系统登录界面背景怎么修改?
    如何在win7下通过easyBCD引导安装Ubuntu14.04
    为什么我的电脑打不开便签?
    打开Word为什么会出现感叹号呢???
    图像变换原理
    运行
    php、前端开发(网站建设)环境搭建
    zend studio面板功能
    zend studio汉化
  • 原文地址:https://www.cnblogs.com/lidabo/p/7554455.html
Copyright © 2011-2022 走看看