Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
|
prog:lazarus:cas:processus:processus [24/04/2021 13:06] thierry [Classes] |
prog:lazarus:cas:processus:processus [24/04/2021 15:41] (Version actuelle) thierry [Trouver le nom complet d'un Processus avec QueryFullProcessImageName] |
||
|---|---|---|---|
| Ligne 17: | Ligne 17: | ||
| <note tip>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 ???</note> | <note tip>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 ???</note> | ||
| + | ==== 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'') | ||
| + | <code delphi> | ||
| + | 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; | ||
| + | |||
| + | |||
| + | </code> | ||
| + | |||
| + | |||
| + | ==== Énumérer les processus ==== | ||
| + | * Voir : [[https://wiki.freepascal.org/AppIsRunning]] | ||
| + | * [[https://wiki.lazarus.freepascal.org/Windows_Programming_Tips#Showing.2Ffinding_processes]] | ||
| + | |||
| + | <code delphi> | ||
| + | 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; | ||
| + | </code> | ||
| + | ==== Énumérer les fenêtres actives ==== | ||
| + | <code delphi> | ||
| + | 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); | ||
| + | </code> | ||
| + | * [[https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-enumwindows]] | ||
| + | |||