Ceci est une ancienne révision du document !


Les Processus

Classes

Les classes qui gèrent les processus :

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 (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 ???

QueryFullProcessImageName

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;
 
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;

Énumérer les processus

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);
Vous pourriez laisser un commentaire si vous étiez connecté.