NOTES :
Cette application montre comment obtenir la liste des process en cours. Puis sur un process particulier comment
obtenir la liste des threads et enfin la listes des fenêtres principales afin de leur envoyer une demande de fermeture.
CODE :
Unit Unit1; // // Sujet : Lister et fermer les process // // Par Nono40 : http://nono40.developpez.com http://nono40.fr.st // mailTo:nono40@fr.st // // Le 11/11/2003 //
// Mise à jour de la liste des process Procedure TForm1.btnMAJClick(Sender: TObject); Var h : Integer;
me32 : TProcessEntry32; Begin // Effacement de la liste
Liste.Clear;
// Création d'un image de la liste actuelle des process
h := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
me32.dwSize := sizeof(me32);
Liste.Items.BeginUpdate; Try // Ouverture de la liste des process créée précédemment If Process32First(h,me32) Then Repeat With Liste.Items.Add Do Begin // Affichage de chaque process
Caption:=IntToHex(me32.th32ProcessID,8);
SubItems.Add(me32.szExeFile);
// Data va conserver le ProcessID afin de pouvoir // en demander la fermeture par la suite
Data:=Pointer(me32.th32ProcessID); End; // Il faut boucler sur toute la liste UntilNot Process32Next(h,me32); Finally // Et libérer la liste
CloseHandle(h);
Liste.Items.EndUpdate End; End;
// Procédure de rappel pour l'énumération des fenêtres // d'un thread Function EnumThreadWindowProc(H:THandle;Param:Pointer):Bool;Stdcall; Begin // Pour chaque fenêtre trouvée, on envoie un message pour en // demander sa fermeture. Ici c'est un Post et non un Send // pour ne pas bloquer l'application.
PostMessage(H,WM_CLOSE,0,0);
// Continuer l'énumération
Result:=True; End;
// Procédure de fermeture d'un process Procedure TForm1.btnTerminerClick(Sender: TObject); Var h : Integer;
Te32 : TThreadEntry32;
hProcess : THandle; Begin // Test si un process est sélectionné If Liste.Items[Liste.ItemIndex]=NilThen Exit;
// Création de la liste des Threads pour // trouver ceux associés au process
h := CreateToolHelp32Snapshot(TH32CS_SNAPTHREAD,0);
// Le process à fermer est contenu dans la propriété // Data de l'item de la liste
hProcess := THandle(Liste.Items[Liste.ItemIndex].Data);
// Recherche des Thread appartenant aux process
Te32.dwSize := SizeOf(Te32); If Thread32First(h,Te32) Then Repeat // Si le thread est créé par le process à fermer If Te32.th32OwnerProcessID=hProcess Then Begin // Alors on recherche les fenêtres appartenant aux Thread // L'énumération va ensuite envoyé WM_CLOSE à chaque fenêtre
EnumThreadWindows(Te32.th32ThreadID,@EnumThreadWindowProc,0); End; UntilNot Thread32Next(h,Te32) Else RaiseLastOSError;