====== Les Processus ======
===== Classes =====
Les classes qui gèrent les processus :
* [[prog:lazarus:classes:tasyncprocess]]
* [[prog:lazarus:classes:tprocess]]
===== Astuces =====
==== Trouver le filename complet d'une commande ====
Exemple : trouver le filename complet de la commande ''php''.
Grâce a la fonction ''FindFilenameOfCmd(ProgramFilename: string): string'' qui se trouve dans l'unit ''UTF8Process'' ([[#tprocessutf8|voir ci-dessus]])
''FindFilenameOfCmd('php')'' => ''C:\Program Files\php\php-7.3.6\php.exe''
Cette fonction utilise les fonctions suivantes : ''fileutil:FindDefaultExecutablePath'' qui parcours tous les PATHs a la recherche de ce fichier (grâce à ''fileutil:SearchFileInPath'').
N'aurait t'il pas été plus facile d'utiliser ''JwaPsApi:GetProcessImageFileName'' ou ''QueryFullProcessImageNameA'' en passant le Handle du TProcess pour retrouver ce nom de fichier ???
==== Trouver le nom complet d'un Processus avec QueryFullProcessImageName ====
Ci dessous :
* ''GetFullProcessImageName'' retourne le nom de fichier complet en fonction du Handle du procesus
* ''GetFullProcessImageNameByProcID'' retourne le nom de fichier complet en fonction de l'ID du procesus.\\ (Récupere le Handle avec un ''OpenProcess'' puis appel ''GetFullProcessImageName'')
uses Windows;
...
function GetFullProcessImageName(const AProcessHandle: THandle): string;
var
vS: UnicodeString;
vLen: DWORD;
begin
vLen := MAX_PATH;
vS := '';
SetLength(vS, vLen);
Result := ''; //par defaut
if QueryFullProcessImageNameW(AProcessHandle, 0, @vS[1], @vLen) then
begin
SetLength(vS, vLen);
Result := UTF8Encode(vS);
end;
end;
function GetFullProcessImageNameByProcID(const AProcId: DWord): string;
var
vHandle: THandle;
begin
Result := '';
vHandle := OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, False, AProcId);
if vHandle > 0 then
begin
try
Result := GetFullProcessImageName(vHandle);
finally
CloseHandle(vHandle);
end;
end;
end;
==== Énumérer les processus ====
* Voir : [[https://wiki.freepascal.org/AppIsRunning]]
* [[https://wiki.lazarus.freepascal.org/Windows_Programming_Tips#Showing.2Ffinding_processes]]
uses JwaTlHelp32 ;
// ATTENTION bien JwaTlHelp32, pas JwaWindows, sinon ça marche pas !
...
procedure EnumProc;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
Form1.MMLog.Lines.Add('Process exe[%s]', [FProcessEntry32.szExeFile]);
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;
==== Énumérer les fenêtres actives ====
uses Windows;
...
function EnumWindowsProc(WHandle: HWND; LParM: LParam): longbool; stdcall; export;
var
vTitleC, vClassC: array[0..128] of char;
vTitle, vClass: string;
begin
Result := True;
GetWindowText(wHandle, vTitleC, 128);
GetClassName(wHandle, vClassC, 128);
vTitle := vTitleC;
vClass := vClassC;
Form1.MMLog.Lines.Add('Window Title[%s], Class[%s], Handle[%d], %s',
[vTitle, vClass, whandle,
BoolToStr(IsWindowVisible(wHandle), 'Visible', 'Caché')]);
end;
...
// On appel cette procédure avec :
EnumWindows(@EnumWindowsProc, 0);
* [[https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-enumwindows]]