Przykład jak sprawdzić czy proces istnieje. Możesz przerobić na sprawdzanie po nazwie procesu lub procesu pliku, bo ten przykład zrobiłem na własne potrzeby na sprawdzanie po numerze PID procesu...
function ProcessExists(PID: string): Boolean;
var
i: integer;
H1, H2: THandle;
Lista: TStringList;
Proces: tagPROCESSENTRY32;
begin
Result := False;
Lista := TStringList.Create;
H1 := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
Proces.dwSize := SizeOf(Proces);
if Process32First(H1, Proces) then
repeat
H2 := OpenProcess(PROCESS_QUERY_INFORMATION, False, Proces.th32ProcessID);
Lista.Add(IntToStr(Proces.th32ProcessID));
CloseHandle(H2);
until not Process32Next(H1, Proces);
CloseHandle(H1);
Sleep(60);
Application.ProcessMessages;
for i := Lista.Count-1 downto 0 do
if Lista.Strings[i] = PID then
begin
Result := True;
Break;
end;
Lista.Free;
end;
Jeśli proces o np.: numerze PID 1000 istnieje, wartość funkcji zwraca wartość
True
Tutaj masz jak pobrać nazwę pliku procesu na podstawie numeru PID z powyżeszej funkcji:
function ProcessFileName(PID: DWORD): string;
var
Handle: THandle;
begin
Result := '';
Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID);
if Handle <> 0 then try
SetLength(Result, MAX_PATH); begin
if GetModuleFileNameEx(Handle, 0, PChar(Result), MAX_PATH) > 0 then
SetLength(Result, StrLen(PChar(Result))) else Result := ''; end;
finally CloseHandle(Handle); end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(ProcessFileName(1000));
end;
Oraz jak pobrać listę samych nazw procesów:
var
_HWND : THandle;
Proc : TProcessEntry32;
begin
Process.Clear;
_HWND := CreateToolHelp32SnapShot(TH32CS_SNAPALL,0);
Proc.dwSize:=SizeOf(Proc);
if Integer(Process32First(_HWND, Proc)) <> 0 then
repeat
ListBox1.Items.Add(Proc.szExeFile);
until Integer(Process32Next(_HWND, Proc)) = 0;
CloseHandle(_HWND);
end;
Wymagane unity:
uses
TlHelp32, PSApi, ShellApi, ShlObj;
Jak "wmontować" to w swój program, pozostawiam Tobie do prostej nauki :d