You can use the
GetProcessTimes
function to get the times per process:
A quick and dirty example:
[Edit] improved solution.
#pragma once
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <tchar.h>
#include <Psapi.h>
#include <CommCtrl.h>
#include <malloc.h>
#pragma comment (lib,"Psapi.lib")
#pragma comment (lib,"user32.lib")
#pragma comment (lib,"comctl32.lib")
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
template <class TI>
class tArray
{
public:
tArray(){ count=0; array=0; }
~tArray(){ if(array) free(array); }
void Resize(const size_t n){ array=(TI*)(array?realloc(array,sizeof(TI)*n):malloc(sizeof(TI)*n)); count=n; }
public:
size_t count;
TI* array;
};
static double __todouble(const FILETIME& ft)
{
return (4294967296.0 * (double)ft.dwHighDateTime) + (double)ft.dwLowDateTime;
}
static int __isnull(const FILETIME& ft)
{
return (ft.dwHighDateTime|ft.dwLowDateTime)?0:1;
}
enum{ IDC_LIST=101, };
void OnTimer(HWND hlist)
{
if(!IsWindow(hlist)) return;
tArray<unsigned long> array;
unsigned long count;
unsigned long ix,len;
HANDLE hproc;
TCHAR mod[0x4000];
LVITEM lvi;
int nitems;
const double nanoseconds100 = 100.0/1e9;
nitems = ListView_GetItemCount(hlist);
lvi.iItem = 0;
for
(
count=0,array.Resize(256);
EnumProcesses(array.array,sizeof(unsigned long)*array.count,&count);
array.Resize(array.count<<1)
)
{
count /= sizeof(unsigned long);
if(array.count>count)
break;
}
for(ix=0;ix<count;ix++)
{
hproc = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,1,array.array[ix]);
if(hproc && (INVALID_HANDLE_VALUE!=hproc))
{
FILETIME ftc,fte,ftk,ftu,ftn;
GetSystemTimeAsFileTime(&ftn);
if(GetProcessTimes(hproc,&ftc,&fte,&ftk,&ftu))
{
double t0 = __todouble(ftc);
double t1 = __isnull(fte)?__todouble(ftn):__todouble(fte);
double uu = __todouble(ftu);
double kk = __todouble(ftk);
len = sizeof(mod)/sizeof(mod[0]);
if(!QueryFullProcessImageName(hproc,0,mod,&len)) len = 0;
mod[len] = 0;
lvi.mask = LVIF_TEXT;
lvi.pszText = mod;
lvi.iSubItem = 0;
if(lvi.iItem<nitems)
ListView_SetItem(hlist,&lvi);
else
ListView_InsertItem(hlist,&lvi);
++lvi.iSubItem;
_stprintf_s(mod,sizeof(mod)/sizeof(mod[0]),__TEXT("%.3lf"),uu*nanoseconds100);
lvi.mask = LVIF_TEXT;
lvi.pszText = mod;
ListView_SetItem(hlist,&lvi);
++lvi.iSubItem;
_stprintf_s(mod,sizeof(mod)/sizeof(mod[0]),__TEXT("%.3lf"),(t1-t0)*nanoseconds100);
lvi.mask = LVIF_TEXT;
lvi.pszText = mod;
ListView_SetItem(hlist,&lvi);
++lvi.iSubItem;
_stprintf_s(mod,sizeof(mod)/sizeof(mod[0]),__TEXT("%.2lf"),100.0*uu/(t1-t0));
lvi.mask = LVIF_TEXT;
lvi.pszText = mod;
ListView_SetItem(hlist,&lvi);
++lvi.iItem;
}
CloseHandle(hproc);
}
}
for(;lvi.iItem<nitems;nitems--) ListView_DeleteItem(hlist,lvi.iItem);
}
void OnInit(HWND hDlg)
{
HWND hlist;
SetTimer(hDlg,100,1000,0);
hlist = GetDlgItem(hDlg,IDC_LIST);
if(hlist)
{
int icol = 0;
LVCOLUMN lvc = {LVCF_TEXT|LVCF_WIDTH,0};
RECT rc; GetClientRect(hlist,&rc);
int width = rc.right-rc.left-GetSystemMetrics(SM_CXVSCROLL);
lvc.cx = MulDiv(width,60,100);
lvc.pszText = __TEXT("module");
if(-1!=ListView_InsertColumn(hlist,icol,&lvc)) ++icol;
lvc.fmt = LVCFMT_RIGHT;lvc.mask |= LVCF_FMT;
lvc.cx = MulDiv(width,15,100);
lvc.pszText = __TEXT("user-time");
if(-1!=ListView_InsertColumn(hlist,icol,&lvc)) ++icol;
lvc.cx = MulDiv(width,15,100);
lvc.pszText = __TEXT("total-time");
if(-1!=ListView_InsertColumn(hlist,icol,&lvc)) ++icol;
lvc.cx = MulDiv(width,10,100);
lvc.pszText = __TEXT("%");
if(-1!=ListView_InsertColumn(hlist,icol,&lvc)) ++icol;
ListView_SetExtendedListViewStyle(hlist,LVS_EX_FULLROWSELECT|LVS_EX_DOUBLEBUFFER );
OnTimer(hlist);
}
}
static int FAR PASCAL __dlgproc(HWND h,unsigned int m,WPARAM w,LPARAM l)
{
switch(m)
{
case WM_INITDIALOG: OnInit(h); break;
case WM_TIMER: OnTimer(GetDlgItem(h,IDC_LIST)); break;
case WM_CLOSE: EndDialog(h,0); break;
}
return 0;
}
int FAR PASCAL _tWinMain(HINSTANCE h,HINSTANCE p,LPTSTR c,int sw)
{
struct
{
DLGTEMPLATE t;
unsigned short menu;
unsigned short wclass;
unsigned short title[13];
unsigned short font_size;
unsigned short font_face[8];
unsigned char dword_padding[2];
struct
{
DLGITEMTEMPLATE t;
unsigned short wclass[sizeof(WC_LISTVIEW)/sizeof(TCHAR)];
unsigned short title[1];
unsigned short data;
} list;
enum { WS=WS_CHILD|WS_VISIBLE|WS_TABSTOP, };
} dlgt =
{
{WS_OVERLAPPED|WS_SYSMENU|WS_MINIMIZEBOX|DS_CENTER|DS_SETFONT,0,1,0,0,400,300},0,0,L"Process view",
10,L"Verdana",{0},
{{dlgt.WS|WS_BORDER|LVS_REPORT|LVS_SINGLESEL,0,4,4,390,280,IDC_LIST},WC_LISTVIEW,L"",0},
};
InitCommonControls();
DialogBoxIndirectParam(h,(DLGTEMPLATE*)&dlgt,(HWND)0,__dlgproc,0);
return 0;
}
Good luck.