打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
获取CPU占用率 进程CPU占用率
进程在同名的情况下只取第一个的占用率

.h
//CpuInfo.h
#ifndef _CPU_USAGE_H_
#define _CPU_USAGE_H_
#define _WIN32_WINNT 0x0501 //XP SP1 以下版本的系统开启此宏
#include <windows.h>
bool GetSysUsage(char * ProcessName,int &SysUseage,int &ProcessUseage);

#endif

.cpp
//CpuInfo.cpp
#include "stdafx.h"
#include <windows.h>
#include "CpuInfo.h"
#include <strsafe.h>
#include"tlhelp32.h"  
//#define USE_DEPRECATED_FUNCS
BOOL SetPrivilege(HANDLE hProcess, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege);
double FileTimeToDouble(FILETIME &filetime);
DWORD CheckModule( char* ProcessName);

bool GetSysUsage(char * ProcessName,int &SysUseage,int &ProcessUseage)
{
int nCPUUseRate = -1;
int nProcessUseRate = -1;

double fOldCPUIdleTime;  
double fOldCPUKernelTime;  
double fOldCPUUserTime;

double fOldProcCreationTime;
double fOldProcExitTime;
double fOldProcKernelTime;
double fOldProcUserTime;

double fCPUIdleTime;  
double fCPUKernelTime;  
double fCPUUserTime;

double fProcCreationTime;
double fProcExitTime;
double fProcKernelTime;
double fProcUserTime;


FILETIME ftIdle, ftKernel, ftUser;

FILETIME ftProcCreation, ftProcExit, ftProcKernel, ftProcUser;


DWORD ProcessId = CheckModule(ProcessName);

HANDLE hCurrentProcess = GetCurrentProcess();

if(!SetPrivilege(hCurrentProcess, SE_DEBUG_NAME, TRUE))
{
return false;
}

HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION , TRUE, ProcessId);



if (GetSystemTimes(&ftIdle, &ftKernel, &ftUser))  
{  
fOldCPUIdleTime = FileTimeToDouble(ftIdle);  
fOldCPUKernelTime = FileTimeToDouble(ftKernel);  
fOldCPUUserTime = FileTimeToDouble(ftUser);
}
else
{
return false;
}

if(GetProcessTimes(hProcess, &ftProcCreation, &ftProcExit, &ftProcKernel, &ftProcUser))
{
fOldProcCreationTime = FileTimeToDouble(ftProcCreation);
fOldProcExitTime= FileTimeToDouble(ftProcExit);
fOldProcKernelTime= FileTimeToDouble(ftProcKernel);
fOldProcUserTime= FileTimeToDouble(ftProcUser);
}
else
{
return false;
}


Sleep(1000);

if (GetSystemTimes(&ftIdle, &ftKernel, &ftUser))  
{  
fCPUIdleTime = FileTimeToDouble(ftIdle);  
fCPUKernelTime = FileTimeToDouble(ftKernel);  
fCPUUserTime = FileTimeToDouble(ftUser);  
nCPUUseRate= (int)(100.0 - (fCPUIdleTime - fOldCPUIdleTime)   
/ (fCPUKernelTime - fOldCPUKernelTime + fCPUUserTime - fOldCPUUserTime)   
*100.0);
SysUseage = nCPUUseRate;
}
else
{
return false;
}

if(GetProcessTimes(hProcess, &ftProcCreation, &ftProcExit, &ftProcKernel, &ftProcUser))
{
fProcCreationTime = FileTimeToDouble(ftProcCreation);
fProcExitTime= FileTimeToDouble(ftProcExit);
fProcKernelTime= FileTimeToDouble(ftProcKernel);
fProcUserTime= FileTimeToDouble(ftProcUser);
nProcessUseRate= (int)((fProcUserTime - fOldProcUserTime+fProcKernelTime - fOldProcKernelTime)
/(fCPUKernelTime - fOldCPUKernelTime + fCPUUserTime - fOldCPUUserTime)*100.0);
ProcessUseage = nProcessUseRate;
}
else
{
return false;
}



}

DWORD CheckModule( char* ProcessName)
{
HANDLE hSnapshot;  
PROCESSENTRY32 lppe;  
BOOL Find;  
BOOL Found;  
hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//创建进程快照  
lppe.dwSize=sizeof(PROCESSENTRY32);  
Found=Process32First(hSnapshot,&lppe);//得到第一个进程  
while(Found)//进程不是空  
{  
if(strcmpi(ProcessName,lppe.szExeFile)==0)//进程名比较  
return lppe.th32ProcessID;//一样即反回进程ID  
Found = Process32Next(hSnapshot,&lppe);//得到下一个进程  
}  
CloseHandle(hSnapshot);  

return NULL;  
}

double FileTimeToDouble(FILETIME &filetime)  
{  
return (double)(filetime.dwHighDateTime * 4.294967296E9) + (double)filetime.dwLowDateTime;  
}  

BOOL SetPrivilege(HANDLE hProcess, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
HANDLE hToken;
if(!OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken))
{
return FALSE;
}
LUID luid;
if(!LookupPrivilegeValue(NULL, lpszPrivilege, &luid))
{
return FALSE;
}
TOKEN_PRIVILEGES tkp;
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = luid;
tkp.Privileges[0].Attributes = (bEnablePrivilege) ? SE_PRIVILEGE_ENABLED : FALSE;
if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL))
{
return FALSE;
}
return TRUE;
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
检测进程是否在运行【源】
编程获取系统当前cpu使用率/空闲率 、内存使用率、剩余可用内存等
《Windows核心编程》学习笔记(7)– 详解线程
Delphi 的 7zip 压缩算法
C# 操作地址 从内存中读取写入数据(初级)
C#判断程序是否运行的方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服