Chercher et tuer real player et real one

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

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.