Код (Text): #include <windows.h> #include <largeint.h> typedef struct _PROCESS_TIME { DWORD dwProcessId; LARGE_INTEGER ProcessTime; LARGE_INTEGER SystemTime; } PROCESS_TIME; DWORD GetCPUUsageByProcessID(DWORD dwProcessId) { FILETIME ftKernelTime, ftUserTime, ftCreationTime, ftExitTime, ftSystemTime; HANDLE hProcess; DWORD dwResult; LARGE_INTEGER ProcessTime, SystemTime, LargeInteger, Remainder; PROCESS_TIME pt; static PROCESS_TIME apt[1024] = { 0 }; int i; hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessId); GetProcessTimes(hProcess, &ftCreationTime, &ftExitTime, &ftKernelTime, &ftUserTime); GetSystemTimeAsFileTime(&ftSystemTime); CopyMemory(&ProcessTime, &ftUserTime, sizeof(LARGE_INTEGER)); CopyMemory(&LargeInteger, &ftKernelTime, sizeof(LARGE_INTEGER)); ProcessTime = LargeIntegerAdd(ProcessTime, LargeInteger); CopyMemory(&SystemTime, &ftSystemTime, sizeof(LARGE_INTEGER)); pt.dwProcessId = dwProcessId; pt.ProcessTime = ProcessTime; pt.SystemTime = SystemTime; for (i = 0; apt[i].dwProcessId && i < 1024; i++) if (apt[i].dwProcessId == dwProcessId) break; ProcessTime = LargeIntegerSubtract(ProcessTime, apt[i].ProcessTime); SystemTime = LargeIntegerSubtract(SystemTime, apt[i].SystemTime); ProcessTime = ExtendedIntegerMultiply(ProcessTime, 100); LargeInteger = LargeIntegerDivide(ProcessTime, SystemTime, &Remainder); CopyMemory(&dwResult, &LargeInteger, sizeof(DWORD)); apt[i] = pt; return dwResult; } Наиболее простой вариант, но дает неправильные данные при первом вызове, т.е. для правильного результата нужно вызывать хотя бы 2 раза с небольшой задержкой. Или лучше используй PDH API (MSDN)