Как я могу получить информацию о других процессах с Delphi? - PullRequest
3 голосов
/ 11 апреля 2010

Я хочу создать программу Task Manager, которая отображает эту информацию:

  1. Имя изображения
  2. использование памяти
  3. PID

Как я могу это сделать?

Ответы [ 5 ]

7 голосов
/ 11 апреля 2010

Вам не нужен J (WS) CL, поэтому существует простой вызов WinAPI, который делает почти все, что вы хотите, и это CreateToolhelp32Snapshot. Чтобы получить снимок всех запущенных процессов, вы должны вызвать его следующим образом:

var
  snapshot: THandle;
begin
  snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

Теперь у вас есть список всех запущенных процессов. Вы можете перемещаться по этому списку с помощью функций Process32First и Process32Next, записи списка являются PROCESSENTRY32 -структурами (которые среди прочего содержат идентификатор процесса и имя изображения).

uses 
  Windows, TLHelp32, SysUtils; 

var 
  snapshot: THandle; 
  ProcEntry: TProcessEntry32; 
  s: String; 
begin
  snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
  if (snapshot <> INVALID_HANDLE_VALUE) then begin 
    ProcEntry.dwSize := SizeOf(ProcessEntry32); 
    if (Process32First(snapshot, ProcEntry)) then begin 
      s := ProcEntry.szExeFile; 
      // s contains image name of the first process 
      while Process32Next(snapshot, ProcEntry) do begin 
        s := ProcEntry.szExeFile; 
        // s contains image name of the current process 
      end; 
    end; 
  end; 
  CloseHandle(snapshot);

Однако информация об использовании памяти, по-видимому, не включена, но вы можете получить ее с помощью другого простого вызова API, GetProcessMemoryInfo

uses
  psAPI;

var
  pmc: TProcessMemoryCounters;
begin
  pmc.cb := SizeOf(pmc) ;
  if GetProcessMemoryInfo(processID, @pmc, SizeOf(pmc)) then
    // Usage in Bytes: pmc.WorkingSetSize
  else
    // fail

Вам просто нужно вызвать эту функцию с идентификаторами процессов, полученными из моментального снимка.

2 голосов
/ 11 апреля 2010

вы можете использовать класс WMI Win32_Process , чтобы получить всю информацию о запущенном процессе.дополнительно вы можете проверить класс Win32_PerfFormattedData_PerfProc_Process , чтобы получить счетчики производительности, связанные с использованием процессора и памяти.

Проверьте этот пример

program WMIProcessInfo;

{$APPTYPE CONSOLE}

uses
  SysUtils
  ,ActiveX
  ,ComObj
  ,Variants;


procedure GetWin32_Process;
var
  objWMIService : OLEVariant;
  colItems      : OLEVariant;
  colItem       : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;

  User          : OLEVariant;
  Domain        : OLEVariant;

  function GetWMIObject(const objectName: String): IDispatch;
  var
    chEaten: Integer;
    BindCtx: IBindCtx;
      Moniker: IMoniker;
  begin
    OleCheck(CreateBindCtx(0, bindCtx));
    OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
  end;

begin
  objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2');
  colItems      := objWMIService.ExecQuery('SELECT * FROM Win32_Process','WQL',0);
  oEnum         := IUnknown(colItems._NewEnum) as IEnumVariant;

      WriteLn(Format('%-20s %6s %10s %10s %10s',['Caption','PID','User','Domain','Working Set ( Kb Memory)']));
  while oEnum.Next(1, colItem, iValue) = 0 do
  begin
      colItem.GetOwner(User,Domain);
      if colItem.GetOwner( User, Domain ) =0 then //get the user and domain
      WriteLn(Format('%-20s %6s %10s %10s %10s',[colItem.Caption,colItem.ProcessId,User,Domain,colItem.WorkingSetSize / 1024]))
      else
      WriteLn(Format('%-20s %6s %10s %10s %10s',[colItem.Caption,colItem.ProcessId,'','',colItem.WorkingSetSize / 1024]));

  end;
end;


begin
 try
    CoInitialize(nil);
    try
      GetWin32_Process;
      Readln;
    finally
    CoUninitialize;
    end;
 except
    on E:Exception do
    Begin
        Writeln(E.Classname, ': ', E.Message);
        Readln;
    End;
  end;
end.
2 голосов
/ 11 апреля 2010

Используйте PSAPI (API статуса процесса). Открытый исходный код JCL имеет оболочку Delphi для PSAPI.

Есть еще несколько хороших стековых потоков Delphi PSAPI вопросы вы можете проверить ответы.

- Йерун

1 голос
/ 11 апреля 2010

ProcessInfo предоставляет основную информацию о запущенных процессах в Windows. Он с открытым исходным кодом и содержит демонстрацию менеджера задач.

1 голос
/ 11 апреля 2010

В Jwscl есть класс, который может сделать это за вас (JwsclTerminalServer):

 var
   ATerminalServer: TJwTerminalServer;
   i: Integer;
 begin
   // Create Terminal Server instance and allocate memory for it
   ATerminalServer := TjwTerminalServer.Create;

   // Set servername (only in case of remote server)
   ATerminalServer.Server := 'TS001';

   // Remember that EnumerateProcesses will automatically connect to the
   // Terminal Server for you. The connect function raises an Exception
   // if the connection attempt was unsuccessfull, so better use try..except
   try
     if ATerminalServer.EnumerateProcesses then
     begin

       // Now loop through the list
       for i := 0 to ATerminalServer.Processes.Count - 1 do
       begin
         Memo1.Lines.Add(ATerminalServer.Processes[i].ProcessName);
       end;

     end;
   except
     on E: EJwsclWinCallFailedException do
     begin
       // Handle Exception here
     end;
   end;

   // Free Memory
   ATerminalServer.Free;
 end;

Хотя устройство предназначено для сервера терминалов, эта часть работает как с, так и без, и в качестве бонуса вы можете использовать его и на удаленных системах.

Для каждого процесса возвращается подробная информация, проверьте документы для подробностей.

Для использования памяти вы можете использовать свойства ProcessMemUsage и ProcessVirtualSize, для Pid есть свойство ProcessId

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...