Una primera solución seria la siguiente:
Código Delphi
[-]
uses psapi;
function GetProcessHandleCount(hProcess: THandle; var pdwHandleCount: DWORD): BOOL;
stdcall; external 'Kernel32.dll' name 'GetProcessHandleCount';
procedure GetHandleCounts(Lista: TStringList);
var
Procesos: array[1..1024] of DWORD;
Needed: DWORD;
i: integer;
Process: THANDLE;
ModName: array[0..MAX_PATH] of char;
HandleCount: DWORD;
begin
Lista.Clear;
if EnumProcesses(@Procesos, sizeof(Procesos), Needed ) then
begin
for i:= 1 to (Needed div sizeof(DWORD)) do
begin
Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE,Procesos[i]);
if (Process<>0) then
begin
if GetModuleFileNameEx(Process, 0, ModName,sizeof(ModName)-1) > 0 then
if GetProcessHandleCount(Process, HandleCount) then
Lista.Add(string(PChar(@ModName)) + '=' + IntToStr(HandleCount));
CloseHandle(Process);
end;
end;
end;
end;
var
Lista: TStringList;
begin
Lista:= TStringList.Create;
try
GetHandleCounts(Lista);
ShowMessage(Lista.Text);
finally
Lista.Free;
end;
end;
El único problema, siempre hay un problema
, es que si se utiliza desde una aplicación normal no se tiene acceso a todos los procesos. Si quieres acceder a todos los procesos tendrás que utilizar esta función dentro de un servicio, o quizá jugar con los permisos pero esto ultimo no lo he probado.