Admin Fondateur
Nombre de messages : 197 Age : 40 Localisation : Tlemcen ( Algérie ) Date d'inscription : 04/12/2006
| Sujet: Comment tuer un processus à partir de son nom ? Ven 12 Jan - 6:24 | |
| Il est tout à fait possible de tuer un processus directement à partir de son nom de fichier exécutable (par exemple notepad.exe). Pour cela, il suffit d'utiliser cette procédure (il faut rajouter les unités Windows, SysUtils et TlHelp32 à la clause uses) : - Code:
-
function KillProcess(const ProcessName : string) : boolean; var ProcessEntry32 : TProcessEntry32; HSnapShot : THandle; HProcess : THandle; begin Result := False;
HSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if HSnapShot = 0 then exit;
ProcessEntry32.dwSize := sizeof(ProcessEntry32); if Process32First(HSnapShot, ProcessEntry32) then repeat if CompareText(ProcessEntry32.szExeFile, ProcessName) = 0 then begin HProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessEntry32.th32ProcessID); if HProcess <> 0 then begin Result := TerminateProcess(HProcess, 0); CloseHandle(HProcess); end; Break; end; until not Process32Next(HSnapShot, ProcessEntry32);
CloseHandle(HSnapshot); end; Cette fonction renvoie True si elle a réussi, et False dans le cas contraire.
Tout d'abord, on appelle l'API CreateToolhelp32Snapshot pour dresser une liste des processus. Le paramètre TH32CS_SNAPPROCESS indique qu'il faut récupérer tous les processus. Le second paramètre 0 est ignoré : il est utilisé avec d'autres valeurs du premier paramètre. Le handle ainsi renvoyé pourra être passé aux routines Process32First et Process32Next. Ensuite, il faudra le libérer avec CloseHandle. Puis, au moyen de Process32First et Process32Next, on énumère tous les processus du snapshot en plaçant leurs informations dans la variable ProcessEntry32. Pour chaque processus, on teste son nom (nom du fichier exécutable) : s'il est identique, à la casse près, au paramètre ProcessName, alors il faut le tuer. Pour ce faire, on ouvre un handle de processus avec les droits de terminaison (PROCESS_TERMINATE). On passe ce handle à la routine TerminateProcess pour tuer le processus. Ensuite, on le libère avec CloseHandle.
Cette version de la routine ne termine que le premier processus dont le nom est passé en paramètre. Une variante peut être écrite pour tuer tous les processus portant ce nom. Il suffit de modifier un peu le contenu de la boucle, en supprimant le Break et en s'assurant que Result n'est pas remis à False après avoir déjà tué un processus mais ne pas avoir pu tuer un autre. Dans ce cas, la fonction retourne True si elle a tué au moins un processus. - Code:
-
HProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessEntry32.th32ProcessID); if HProcess <> 0 then begin Result := TerminateProcess(HProcess, 0) or Result; CloseHandle(HProcess); end; Attention ! Il est impératif de placer le or Result après l'appel à TerminateProcess, sinon l'optimisation de l'évaluation des or va éviter l'appel à TerminateProcess ! La version dans le zip accepte un paramètre All de type boolean indiquant s'il faut tuer tous les processus trouvés ou seulement le premier. | |
|