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