Chercher et tuer real player et real one

Soyez le premier à donner votre avis sur cette source.

Vue 7 790 fois - Téléchargée 572 fois

Description

Un exemple qui montre comment faire pour trouver et tuer un processus en mémoire à partir de sa classe et son nom. Egalement un petit exemple pour la manipulation de la base de registre de Windows.

A la base le programme sert à nettoyer après une exécution de Real Player ou Real One (qui laissent des processus "squatteurs" et invisibles en mémoire qui démarrent automatiquement avec Windows si on ne les enlève pas) mais vous pouvez l'adapter pour d'autres utilisations.

Source / Exemple :


unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, ExtCtrls, Registry;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Memo1: TMemo;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    (* Déclarations privées *)
  public
    { Déclarations publiques }
  end;
  
const
   ROOT_KEY = HKEY_LOCAL_MACHINE;

var
  Form1: TForm1;
  Proc_RealPlayer, Proc_RealOne : boolean;

implementation

{$R *.DFM}

procedure Log(const s : string);
begin
   Form1.Memo1.Lines.Add(s);
end;

function EnumWindowsProc(Hw: hWnd; Param: LPARAM): Boolean; stdCall;
var
 WinName: array[0..144] of char;
 CName: array[0..144] of char;
 RealHandle : THandle;
begin
 Result:=True;
 // Récupère le nom de la fenêtre à partir du handle
 GetWindowText(Hw, WinName, 144);
 // Récupère le nom de la classe
 GetClassName(Hw, CName, 144);

 // Processus RealPlayer
 // Compare le nom de la classe et de la fenêtre avec ceux, connus, du processus Real Player
 // On converti tout en majuscule pour que la comparaison ne soit pas sensible à la casse.
 if (UpperCase(WinName) = UpperCase('REALPLAYER')) and (UpperCase(CName) = UpperCase('PNGUICLASS')) then begin
    // Le processus a été trouvé
    RealHandle := FindWindow(CName, WinName);
    // On lui envoie le message WM_CLOSE pour qu'il ferme
    SendMessage(RealHandle, WM_CLOSE, 0, 0);
    Proc_RealPlayer := TRUE;
 end;

 // Processus RealOne
 // Idem pour RealOne
 if (UpperCase(WinName) = UpperCase('Notification Wnd for RNAdmin')) and (UpperCase(CName) = UpperCase('RNAdminNotifWndClass')) then begin
    RealHandle := FindWindow(CName, WinName);
    SendMessage(RealHandle, WM_CLOSE, 0, 0);
    Proc_RealOne := TRUE;
 end;

end;

procedure NettoyerRegistre;
var Reg : TRegistry;
begin
   // Créé un nouvelle instance de TRegistry pour manipuler la BDR
   Reg := TRegistry.Create;
   Reg.RootKey := ROOT_KEY;
   // Ouvre la clef \software...\run qui contient les programmes qui se lancent automatiquement au démarrage
   Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', FALSE);
   // Efface l'entrée de RealPlayer si elle est présente
   if Reg.DeleteValue('RealTray') then Log('-- Entrée RealPlayer supprimée dans la base de registre !')
                                  else Log('-- Entrée RealPlayer absente de la base de registre.');
   // Efface l'entrée de RealOne
   Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', FALSE);
   if Reg.DeleteValue('TkBellExe') then Log('-- Entrée RealOne supprimée dans la base de registre !')
                                   else Log('-- Entrée RealOne absente de la base de registre.');
   // Libère la mémoire
   Reg.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Proc_RealOne := FALSE;
   Proc_RealPlayer := FALSE;

   // Enumère toutes les fenêtres en mémoire
   // et envoie leur handle à la procédure EnumWindowsProc qui fait le traitement
   EnumWindows(@EnumWindowsProc, 0);

   if Proc_RealPlayer then Log('-- Processus RealPlayer supprimé !')
                      else Log('-- Processus RealPlayer absent.');

   if Proc_RealOne then Log('-- Processus RealOne supprimé !')
                   else Log('-- Processus RealOne absent.');

   // Nettoie la base de registre de RealPlayer / RealOne
   NettoyerRegistre;

   if AnsiUpperCase(ParamStr(1)) = '-NOWINDOW' then Halt;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   Close;
end;

end.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
7
Date d'inscription
samedi 18 novembre 2006
Statut
Membre
Dernière intervention
22 novembre 2006

Salut ,je suis débutant en matiere de programmation et je travail sur un projet,mais il y a un probléme qui m'intrigue
est ce que vous pouvez m'aider ladsus
le probléme se résume comme suit :
j'ai le nom et le nom de classe d'un window parent d'une application extérne alors j'ai obtenu son handle par la fonction
Findwindow
mais le probléme est comment obtenir le handle de child window tout en sachant le nom et le nom de classe de ce window (child) et que la fonction FindwindowEx n'est pas supporté par windows NT et XP sur lequel je travail
alors comment on fait pour obtenir ce handle ?
Messages postés
5
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
16 mars 2008

Merci.
Pas facile de retrouver les API dont on a besoin.
Je l'utilise pour limiter l'appli à une seule instance.
Avant, je ma basais sur Application.Title jusqu'à ce que je change cette propriété par FormatDatetime dans un timer cours d'exécution.

procedure JustUne_main; // Juste Une instance de l'appli
var SSauve_titre: string;
WinHandle : Thandle;
begin
SSauve_titre := Application.title;
Application.title := 'Application en cours de chargement'; // Pour les grosses applis
WinHandle := findwindow('Tapplication',pchar(SSauve_titre));
if (WinHandle > 0) then begin
if IsIconic(WinHandle) then
ShowWindow(WinHandle,SW_SHOWNORMAL)
else
ShowWindow(WinHandle,SW_SHOW);
SetForegroundWindow(WinHandle);
Application.terminate;
end;
Application.Title := SSauve_titre;
end;

Grâce à ton exemple, je peux trouver une éventuelle instance sur la base du "Caption" de le fiche principale.
Merci encore.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.