Jak pobrać listę odpalonych procesów wraz z pamięcia jaką zajmują

lofix

Na przykladzie prostego programu


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
   function GetMemoryString(ProcessID : DWord;var MemoryString: String):Boolean;
   function BuildList(List: TStrings): Boolean;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

uses
PsAPI;//Windows NT,2k,XP

function TForm1.GetMemoryString(ProcessID : DWord;var MemoryString: String):Boolean;
var
 Bytes, Blocks,
 TaskManWS, TaskManVM: Cardinal;
 PMC: TProcessMemoryCounters;
const
 KiloByte = 1024;
 MegaByte = KiloByte * KiloByte;
begin
 begin
   Result := Win32Check(GetProcessMemoryInfo(ProcessID, @PMC, SizeOf(PMC)));
   TaskManWS := PMC.WorkingSetSize;
   MemoryString := Format(
     '%.0n ($%x) bytes, %.0n ($%x) kb, %.2n ($%x) Mb',
     [TaskManWS * 1.0, TaskManWS,
      TaskManWS / KiloByte, TaskManWS div KiloByte,
      TaskManWS / MegaByte, TaskManWS div MegaByte]);
 end;
end;

function TForm1.BuildList(List: TStrings): Boolean;
var
 PIDs: array[0..1024] of DWORD;
 Handle: THandle;
 Needed: DWORD;
 i: integer;
 ModuleFileName: array[0..MAX_PATH] of char;
 ListIndex: Integer;
 MemoryString: String;
begin
 if (Win32Platform = VER_PLATFORM_WIN32_NT) and
      (Win32MajorVersion > 3) then
 begin
   Result := EnumProcesses(@PIDs, Sizeof(PIDs), Needed);
   if Result then
   begin
     for i := 0 to (Needed div Sizeof(DWORD)) - 1 do
     begin
       if PIDs[i] <> 0 then
       begin
         Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
           False, PIDs[I]);
         if Handle <> 0 then
         begin
           if GetModuleFileNameEx(Handle, 0, ModuleFileName,
                                  Sizeof(ModuleFileName)) <> 0 then
           begin
              GetMemoryString(Handle,MemoryString);
              List.Add(ModuleFileName+ ' - ' + MemoryString);
           end;
         end; // if Handle
         CloseHandle(Handle);
       end; // if PIDs[i]
     end; // for
   end; // if Result
 end
 else
   Result := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 BuildList(ListBox1.Items);
end;

end.

//Podziękowania dla Piter_`a

4 komentarzy

Wypasiona procedurka (żadkość) :)

Z pamięcią powiadasz? A jak z czasem procesora?

raczej tlhelp32

Chciałbym dodać, że PSAPI ma zastosowanie w Windows NT. W Windows 9x należy korzystać z pakietu ToolHelp32.