 |
|
 |
|
 |
70 - FERMER DES PROCESS EXTÉRIEURS
|
|
|
|
PRÉSENTATION :
Fermer des process extérieurs
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
//
Interface
Uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls;
Type
TForm1 = Class(TForm)
Panel1: TPanel;
Liste: TListView;
btnMAJ: TButton;
btnTerminer: TButton;
Procedure btnMAJClick(Sender: TObject);
Procedure btnTerminerClick(Sender: TObject);
Private
{ Déclarations privées }
Public
{ Déclarations publiques }
End;
Var
Form1: TForm1;
Implementation
{$R *.dfm}
Uses tlHelp32;
// 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
Until Not 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]=Nil Then 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;
Until Not Thread32Next(h,Te32)
Else RaiseLastOSError;
// Libération de la liste
CloseHandle(h);
// Mise à jour de la liste
btnMAJClick(Nil);
End;
end.
|
| |
 |
|
 |
Les sources présentées sur cette page sont libres de droits,
et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©
2003 Bruno Guérangé. Aucune reproduction,
même partielle, ne peut être faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc sans l'autorisation expresse de l'auteur.
Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E
de dommages et intérêts.
Cette page est déposée à la
SACD.
|