Developpez.com - Delphi
X

Choisissez d'abord la catégorieensuite la rubrique :

Nono40.developpez.com
Le petit coin du web de Nono40
SOURCES TESTS DELPHI WIN32 AUTOMATISMES DELPHI .NET QUICK-REPORT
Retour à l'accueil
70 - FERMER DES PROCESS EXTÉRIEURS

PRÉSENTATION : Fermer des process extérieurs
ZIP : Téléchargez le zip APERÇUS :

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 œuvre intellectuelle protégée par les droits d'auteur. 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'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -