Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUMS DELPHI F.A.Q DELPHI TUTORIELS DELPHI LIVRES COMPOSANTS SOURCES DEFI TELECHARGEZ DELPHI TV
Nono40.developpez.com
Le petit coin du web de Nono40
SOURCES ARTICLES NONOVISU ACCUEIL NOUVELLES
Retour à l'accueil
70 - FERMER DES PROCESS EXTÉRIEURS

PRÉSENTATION : Fermer des process extérieurs
ZIP : Téléchargez le zip : miroir 1 , miroir 2 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 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.

Responsables bénévoles de la rubrique Delphi : Nono40 et Pedro - Contacter par EMail :
Vos questions techniques : forum d'entraide Delphi - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.