获取进程运行包含的CPU占有率

小雨好赖床 2011-01-06 02:51:49
需要做一个监控,获取几个进程的CPU占有率

仅仅知道进程运行名称包含 “板块A” “板块B”等字样。

个人设想是先通过遍历WIN下面已经运行的进程,然后通过比较进程名称,获取想要的进程ID。然后通过进程ID获取后取CPU占用率。

但是由于目前百度,谷歌都无法上,只有请各位大侠帮忙。

具体用那些函数实现?

或者有更好的方法?

感激不尽!
...全文
208 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
WATER 2011-02-28
  • 打赏
  • 举报
回复
好像有一个专用的函数可以调用的呀
见习学术士 2011-01-06
  • 打赏
  • 举报
回复


int CIisOperator::GetProcessUser(DWORD ProcessId,char *pUserName, int StrLen)
{
HANDLE hToken = NULL;
BOOL TokenRet = false;
PTOKEN_USER pTokenUser = NULL;
DWORD cb = 0;
SID_NAME_USE snu;
char domain[1024];
DWORD cbdomain = 1023;
memset(domain, 0, sizeof(domain));
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, ProcessId);
if(!hProcess)
{
CString temp;
temp.Format("%d",GetLastError());
CString s=temp;
return -1;
}
TokenRet = OpenProcessToken(hProcess, TOKEN_QUERY, &hToken);
if(!TokenRet)
{
if (hProcess)
{
CloseHandle(hProcess);
hProcess = NULL;
}
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, ProcessId);
if(!hProcess) goto ERRORRETURN;
TokenRet = OpenProcessToken(hProcess,TOKEN_QUERY,&hToken);

}
TokenRet =GetTokenInformation(hToken, TokenUser, NULL, cb, &cb);
if(!TokenRet)
{
DWORD dwResult = GetLastError();
if (dwResult != ERROR_INSUFFICIENT_BUFFER) goto ERRORRETURN;
}
pTokenUser =(PTOKEN_USER) GlobalAlloc(GPTR, cb);
if (!pTokenUser) goto ERRORRETURN;

TokenRet = GetTokenInformation(hToken, TokenUser, pTokenUser, cb, &cb);
TokenRet = LookupAccountSid(NULL,pTokenUser->User.Sid,pUserName,
(unsigned long *)&StrLen, domain, &cbdomain, &snu);

if(!TokenRet) goto ERRORRETURN;
if (pTokenUser)
{
GlobalFree(pTokenUser);
pTokenUser = NULL;
}
if (hToken)
{
CloseHandle(hToken);
hToken = NULL;
}
if (hProcess)
{
CloseHandle(hProcess);
hProcess = NULL;
}
return 0;
ERRORRETURN:
if (pTokenUser)
{
GlobalFree(pTokenUser);
pTokenUser = NULL;
}
if (hToken)
{
CloseHandle(hToken);
hToken = NULL;
}
if (hProcess)
{
CloseHandle(hProcess);
hProcess = NULL;
}
return -1;
}
傻X 2011-01-06
  • 打赏
  • 举报
回复
HQUERY hQuery;
PDH_STATUS pdhStatus = PdhOpenQuery(0, 0, &hQuery);
HCOUNTER pCounterHandle;
PDH_FMT_COUNTERVALUE fmtValue;
DWORD dwctrType;
pdhStatus = PdhAddCounter(hQuery, _TEXT("\\Process(conhost)\\% Processor Time"), 0, &pCounterHandle);
pdhStatus = PdhCollectQueryData(hQuery);
Sleep(1000);
pdhStatus = PdhCollectQueryData(hQuery);
pdhStatus = PdhGetFormattedCounterValue(pCounterHandle, PDH_FMT_DOUBLE, &dwctrType, &fmtValue);
pdhStatus = PdhCloseQuery(hQuery);
小雨好赖床 2011-01-06
  • 打赏
  • 举报
回复
已经知道进程ID了,如何获取CPU占用率,有那位帮忙回答一下么?
小雨好赖床 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bragi523 的回复:]

查找进程的函数
[/Quote]


恩,已经能获取到包含指定字符串的进程ID了

剩下的就是通过ID获取CPU占用率了
小雨好赖床 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bragi523 的回复:]

查找进程的函数
[/Quote]

好的,我先来研究一下这段代码,谢谢了
bragi523 2011-01-06
  • 打赏
  • 举报
回复
查找进程的函数
bragi523 2011-01-06
  • 打赏
  • 举报
回复
bool   verifyProcess(LPCTSTR   lpszProcessName)   
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if (hSnapshot == INVALID_HANDLE_VALUE) {
MessageBox(NULL, "Create process snapshot failed !", "Notice", MB_ICONINFORMATION | MB_OK);
return false;
}

PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);

if (!Process32First(hSnapshot, &pe32)) {
MessageBox(NULL, "Process32Frist function runs failed !", "Notice", MB_ICONINFORMATION | MB_OK);
CloseHandle(hSnapshot);
return false;
}

WCHAR wszProcess[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, lpszProcessName,
strlen(lpszProcessName)+1, wszProcess, sizeof(wszProcess)/sizeof(wszProcess[0]));

do {
if (!lstrcmpi(lpszProcessName, pe32.szExeFile))
return true;
} while(Process32Next(hSnapshot, &pe32));

CloseHandle(hSnapshot);

return false;
}
小雨好赖床 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shenyi0106 的回复:]

可以看看ZwQuerySystemInfomation这个内核函数
[/Quote]

在MSDN上找不到这个函数的相关信息。

晚上下班回去我研究一下这个函数,先谢谢。
小雨好赖床 2011-01-06
  • 打赏
  • 举报
回复
无法知道完整的窗口名称,因为窗口名称会包含上版本号,只能知道窗口名包含的某个固定的字符串
shenyi0106 2011-01-06
  • 打赏
  • 举报
回复
可以看看ZwQuerySystemInfomation这个内核函数
daxuewuli417 2011-01-06
  • 打赏
  • 举报
回复
HWND hWnd = FindWindow(NULL, "窗口名 ") ;
DWORD dwThreadId = GetWindowThreadProcessId(hWnd, NULL) ;
这样可以不?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧