====== 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]]