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 ???
Trouver le nom complet d'un Processus avec QueryFullProcessImageName
Ci dessous :
GetFullProcessImageName
retourne le nom de fichier complet en fonction du Handle du procesusGetFullProcessImageNameByProcID
retourne le nom de fichier complet en fonction de l'ID du procesus.
(Récupere le Handle avec unOpenProcess
puis appelGetFullProcessImageName
)
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
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é.