Windows下用C语言获取系统的CPU利用率、内存使用率、硬盘使用率等

来源:互联网 发布:手机网络投资理财收益 编辑:程序博客网 时间:2024/04/29 01:55

最近在做一个网管软件用C语言获取的系统的一些参数,其中包括系统时间,系统运行时间,系统版本,CPU利用率,内存使用率,硬盘使用率,CPU风扇转速等参数,整理代码如下:

#include <stdio.h>#include <Windows.h>#include<time.h>#include <tchar.h>#define DIV 1024#define WIDTH 7#define GB(x) (((x).HighPart << 2) + ((DWORD)(x).LowPart) / 1024.0 / 1024.0 / 1024.0)#pragma warning(disable: 4996)   #define true 1typedefunsigned char U_CHAR;//获取系统时间int getSystemTime(char* buffer){char buf[128];time_t rawtime;struct tm * timeinfo;time(&rawtime);timeinfo = localtime(&rawtime);strftime(buf, sizeof(buf), "Now is %Y-%m-%d %H:%M:%S", timeinfo);strcpy(buffer,buf);}//CPU利用率FILETIME m_preidleTime;FILETIME m_prekernelTime;FILETIME m_preuserTime;__int64 CompareFileTime2(FILETIME time1, FILETIME time2){__int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime;__int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime;return   b - a;}void GetCpuUseage(){GetSystemTimes(&m_preidleTime, &m_prekernelTime, &m_preuserTime);Sleep(1000);}double CpuUseage(){FILETIME idleTime;FILETIME kernelTime;FILETIME userTime;GetSystemTimes(&idleTime, &kernelTime, &userTime);int idle = CompareFileTime2(m_preidleTime, idleTime);int kernel = CompareFileTime2(m_prekernelTime, kernelTime);int user = CompareFileTime2(m_preuserTime, userTime);if (kernel + user == 0)return 0.0;//(总的时间-空闲时间)/总的时间=占用cpu的时间就是使用率double cpu = abs((kernel + user - idle) * 100 / (kernel + user));m_preidleTime = idleTime;m_prekernelTime = kernelTime;m_preuserTime = userTime;return cpu;}//读取操作系统的名称void GetSystemName(char* osname){char buf[128];SYSTEM_INFO info;        //用SYSTEM_INFO结构判断64位AMD处理器 GetSystemInfo(&info);    //调用GetSystemInfo函数填充结构 OSVERSIONINFOEX os;os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);strcpy(buf, "unknown OperatingSystem.");if (GetVersionEx((OSVERSIONINFO *)&os)){//下面根据版本信息判断操作系统名称 switch (os.dwMajorVersion)//判断主版本号{case 4:switch (os.dwMinorVersion)//判断次版本号 {case 0:if (os.dwPlatformId == VER_PLATFORM_WIN32_NT)strcpy(buf, "Microsoft Windows NT 4.0"); //1996年7月发布 else if (os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)strcpy(buf, "Microsoft Windows 95");break;case 10:strcpy(buf, "Microsoft Windows 98"); break;case 90:strcpy(buf, "Microsoft Windows Me"); break;}break;case 5:switch (os.dwMinorVersion)//再比较dwMinorVersion的值{case 0:strcpy(buf, "Microsoft Windows 2000"); //1999年12月发布break;case 1:strcpy(buf, "Microsoft Windows XP"); //2001年8月发布break;case 2:if (os.wProductType == VER_NT_WORKSTATION&& info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64){strcpy(buf, "Microsoft Windows XP Professional x64 Edition"); }else if (GetSystemMetrics(SM_SERVERR2) == 0)strcpy(buf, "Microsoft Windows Server 2003"); //2003年3月发布 else if (GetSystemMetrics(SM_SERVERR2) != 0)strcpy(buf, "Microsoft Windows Server 2003 R2"); break;}break;case 6:switch (os.dwMinorVersion){case 0:if (os.wProductType == VER_NT_WORKSTATION)strcpy(buf, "Microsoft Windows Vista"); elsestrcpy(buf, "Microsoft Windows Server 2008"); //服务器版本 break;case 1:if (os.wProductType == VER_NT_WORKSTATION)strcpy(buf, "Microsoft Windows 7"); elsestrcpy(buf, "Microsoft Windows Server 2008 R2"); break;}break;}}//if(GetVersionEx((OSVERSIONINFO *)&os))strcpy(osname, buf);}int main(){//获取系统时间char buffer[128];getSystemTime(buffer);puts(buffer);//系统运行时间clock_t start, finish;double duration;start = clock();while (true){finish = clock();duration = (double)(finish - start) / CLOCKS_PER_SEC;Sleep(1000);printf("%.0f 秒\n", duration);}//系统版本名称char osname[20];GetSystemName(osname);printf("%s\n", osname);//CPU利用率while (true){U_CHAR  sysStateCpu[5];double cpu = CpuUseage();sprintf((char*)sysStateCpu, "%.2lf", cpu);printf("CPU使用率:%s%%\n", sysStateCpu);Sleep(1000);}//内存使用率char bufPreCPU[5];MEMORYSTATUSEX statex;statex.dwLength = sizeof(statex);GlobalMemoryStatusEx(&statex);sprintf(bufPreCPU, "%ld%%\n", statex.dwMemoryLoad);puts(bufPreCPU);//硬盘使用率 调用windows APIULARGE_INTEGER FreeBytesAvailableC, TotalNumberOfBytesC, TotalNumberOfFreeBytesC;ULARGE_INTEGER FreeBytesAvailableD, TotalNumberOfBytesD, TotalNumberOfFreeBytesD;ULARGE_INTEGER FreeBytesAvailableE, TotalNumberOfBytesE, TotalNumberOfFreeBytesE;ULARGE_INTEGER FreeBytesAvailableF, TotalNumberOfBytesF, TotalNumberOfFreeBytesF; GetDiskFreeSpaceEx(_T("C:"), &FreeBytesAvailableC, &TotalNumberOfBytesC, &TotalNumberOfFreeBytesC);GetDiskFreeSpaceEx(_T("D:"), &FreeBytesAvailableD, &TotalNumberOfBytesD, &TotalNumberOfFreeBytesD);GetDiskFreeSpaceEx(_T("E:"), &FreeBytesAvailableE, &TotalNumberOfBytesE, &TotalNumberOfFreeBytesE);GetDiskFreeSpaceEx(_T("F:"), &FreeBytesAvailableF, &TotalNumberOfBytesF, &TotalNumberOfFreeBytesF);/*参数 类型及说明lpRootPathName String,不包括卷名的磁盘根路径名lpFreeBytesAvailableToCaller LARGE_INTEGER,指定一个变量,用于容纳调用者可用的字节数量lpTotalNumberOfBytes LARGE_INTEGER,指定一个变量,用于容纳磁盘上的总字节数lpTotalNumberOfFreeBytes LARGE_INTEGER,指定一个变量,用于容纳磁盘上可用的字节数适用平台Windows 95 OSR2,Windows NT 4.0*/float totalHardDisk = GB(TotalNumberOfBytesC) + GB(TotalNumberOfBytesD) + GB(TotalNumberOfBytesE) + GB(TotalNumberOfBytesF);float freeHardDisk = GB(TotalNumberOfFreeBytesC) + GB(TotalNumberOfFreeBytesD) + GB(TotalNumberOfFreeBytesE) + GB(TotalNumberOfFreeBytesF);float hardDiskUsage = 1- freeHardDisk / totalHardDisk;//CPU风扇转速printf("hello world!\n");system("pause");}







0 0
原创粉丝点击