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.
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.