这贴以前就有人问过,你找找吧,网上大把资料. 要得到远程主机的cpu利用率应该在远程主机上有相关服务才行,当然你自己也可以做一个客户端和服务端,用客户端连接到服务端上,然后用服务端来得到数据并发送回客户端。 得到数据可以参见: BOOL GetProcessTimes( HANDLE hProcess, // handle to process LPFILETIME lpCreationTime, // process creation time LPFILETIME lpExitTime, // process exit time LPFILETIME lpKernelTime, // process kernel-mode time LPFILETIME lpUserTime // process user-mode time ); 所有的内核时间+用户时间就是cpu时间,也就是cpu利用率。 当然这里面要得到所有进程的句柄才行,得到所有进程句柄可以参见: // copy right @ 1995-2001 for bsmith in Zhejiang university // no use in mechical HANDLE FSnapshotHandle; HANDLE hProcess; PROCESSENTRY32 FProcessEntry32; BOOL ContinueLoop; FSnapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); FProcessEntry32.dwSize = sizeof(FProcessEntry32); ContinueLoop = Process32First(FSnapshotHandle,& FProcessEntry32); while (ContinueLoop) { hProcess = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, FProcessEntry32.th32ProcessID); CloseHandle(hProcess); ContinueLoop = Process32Next(FSnapshotHandle,& FProcessEntry32); } CloseHandle(FSnapshotHandle);
刚看到一篇文章,你看看是否有用. <Getting CPU Usage in a Multiprocessor Machine> http://www.codeproject.com/KB/system/MultiCPUUsage.aspx
使用pdh的API最简单.LONG GetProcessCPUUsage() {
HQUERY hQuery; HCOUNTER hCounter; PDH_FMT_COUNTERVALUE fmtValue; DWORD ctrType; typedef HANDLE PDH_HQUERY; typedef HANDLE PDH_HCOUNTER; char PathBuffer[MAX_PATH] = {0}; ZeroMemory(PathBuffer,sizeof(PathBuffer)); _snprintf(PathBuffer,sizeof(PathBuffer) - 1,"\\Process(%s)\\%c Processor Time","explorer",'%'); if (PdhOpenQuery(0,0,&hQuery) == ERROR_SUCCESS) { if (PdhAddCounter(hQuery,PathBuffer,0,&hCounter) == ERROR_SUCCESS) { LONG Start = 0; LONG End = 0; for (UINT i = 0 ; i < 2; i++) { if (PdhCollectQueryData(hQuery) == ERROR_SUCCESS) { if (PdhGetFormattedCounterValue(hCounter,PDH_FMT_LONG,&ctrType,&fmtValue) == ERROR_SUCCESS) { if (i == 0) { Start = fmtValue.longValue; } else { End = fmtValue.longValue; if (End > Start) { PdhCloseQuery(hQuery); return (End - Start); } else { PdhCloseQuery(hQuery); return End; } } } else { break; } } else { break; } Sleep(1000); } } PdhCloseQuery(hQuery); } return -1; }以上代码得到explorer的CPU使用率,自己改下就能适用于所有系统进程.
这个是你想要的 task manager的实现版 含源码
所以建议你转换一下思路,不放用HOOK来做
要得到远程主机的cpu利用率应该在远程主机上有相关服务才行,当然你自己也可以做一个客户端和服务端,用客户端连接到服务端上,然后用服务端来得到数据并发送回客户端。
得到数据可以参见:
BOOL GetProcessTimes(
HANDLE hProcess, // handle to process
LPFILETIME lpCreationTime, // process creation time
LPFILETIME lpExitTime, // process exit time
LPFILETIME lpKernelTime, // process kernel-mode time
LPFILETIME lpUserTime // process user-mode time
);
所有的内核时间+用户时间就是cpu时间,也就是cpu利用率。
当然这里面要得到所有进程的句柄才行,得到所有进程句柄可以参见:
// copy right @ 1995-2001 for bsmith in Zhejiang university
// no use in mechical
HANDLE FSnapshotHandle;
HANDLE hProcess;
PROCESSENTRY32 FProcessEntry32;
BOOL ContinueLoop;
FSnapshotHandle
= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize
= sizeof(FProcessEntry32);
ContinueLoop
= Process32First(FSnapshotHandle,& FProcessEntry32);
while (ContinueLoop)
{
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE,
FProcessEntry32.th32ProcessID);
CloseHandle(hProcess);
ContinueLoop
= Process32Next(FSnapshotHandle,& FProcessEntry32);
}
CloseHandle(FSnapshotHandle);
<Getting CPU Usage in a Multiprocessor Machine>
http://www.codeproject.com/KB/system/MultiCPUUsage.aspx
{
HQUERY hQuery;
HCOUNTER hCounter;
PDH_FMT_COUNTERVALUE fmtValue;
DWORD ctrType;
typedef HANDLE PDH_HQUERY;
typedef HANDLE PDH_HCOUNTER; char PathBuffer[MAX_PATH] = {0};
ZeroMemory(PathBuffer,sizeof(PathBuffer));
_snprintf(PathBuffer,sizeof(PathBuffer) - 1,"\\Process(%s)\\%c Processor Time","explorer",'%'); if (PdhOpenQuery(0,0,&hQuery) == ERROR_SUCCESS)
{
if (PdhAddCounter(hQuery,PathBuffer,0,&hCounter) == ERROR_SUCCESS)
{
LONG Start = 0;
LONG End = 0; for (UINT i = 0 ; i < 2; i++)
{
if (PdhCollectQueryData(hQuery) == ERROR_SUCCESS)
{
if (PdhGetFormattedCounterValue(hCounter,PDH_FMT_LONG,&ctrType,&fmtValue) == ERROR_SUCCESS)
{
if (i == 0)
{
Start = fmtValue.longValue;
}
else
{
End = fmtValue.longValue;
if (End > Start)
{
PdhCloseQuery(hQuery);
return (End - Start);
}
else
{
PdhCloseQuery(hQuery);
return End;
}
}
}
else
{
break;
}
}
else
{
break;
}
Sleep(1000);
}
}
PdhCloseQuery(hQuery);
}
return -1;
}以上代码得到explorer的CPU使用率,自己改下就能适用于所有系统进程.