unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ListView: TListView;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
// Enum Processes
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
Types, ActiveX, ComObj, Registry, {$ifdef FPC} JwaPsApi {$else} PsAPI {$endif FPC}, Nb30;
// Enum Processes
function ProcessIDs: TIntegerDynArray;
var ProcessSize: DWORD;
begin
SetLength(Result, 1024);
repeat
SetLength(Result, 2 * Length(Result));
Win32Check(EnumProcesses(@Result[0], Length(Result) * SizeOf(DWORD), ProcessSize));
until Integer(ProcessSize) < Length(Result) * SizeOf(DWORD);
SetLength(Result, ProcessSize div SizeOf(DWORD));
end;
function ProcessName(ProcessID: Integer): string;
var
Process: THandle;
ProcessName: array [0..MAX_PATH] of Char;
begin
Result := '';
Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessID);
if Process <> 0 then
try
if GetModuleBaseName(Process, 0, ProcessName, SizeOf(ProcessName)) <> 0 then
Result := ProcessName;
finally
CloseHandle(Process);
end;
end;
function ProcessFileName(ProcessID: Integer): string;
var
Process: THandle;
FileName: array [0..MAX_PATH] of Char;
begin
Result := '';
Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessID);
if Process <> 0 then
try
if GetModuleFileNameEx(Process, 0, FileName, SizeOf(FileName)) <> 0 then
Result := FileName;
finally
CloseHandle(Process);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Processes: TIntegerDynArray;
I: Integer;
Item: TListItem;
ProcessName1: string;
begin
ListView.Items.BeginUpdate;
try
Processes := ProcessIDs;
for I := 0 to Length(Processes) - 1 do
begin
ProcessName1 := ProcessName(Processes[I]);
if ProcessName1 <> '' then
begin
Item := ListView.Items.Add;
Item.Caption := IntToStr(Processes[I]);
Item.SubItems.Text := ProcessName1;
Item.SubItems.Append(ProcessFileName(Processes[I]));
end;
end;
finally
ListView.Items.EndUpdate;
end;
end;
end.