unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const MY_MESSAGE = WM_USER + 1; type TForm1 = class(TForm) Memo1: TMemo; btnSetHook: TButton; btnUnsetHook: TButton; procedure btnSetHookClick(Sender: TObject); procedure btnUnsetHookClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } procedure MyHandler(var msg: TMessage); message MY_MESSAGE; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} const DLLName = 'myhook.dll'; type Tsetthehook = procedure(Handle: HWND);stdcall; Tdelthehook = procedure;stdcall; var setthehook:TSetthehook; delthehook:TDelthehook; DLLInstance : THandle; Procedure loadlib; begin DLLInstance := LoadLibrary(DLLname); if DLLInstance = 0 then ShowMessage('Cannot Load DLL') else begin @setthehook := GetProcAddress(DLLInstance, 'SetTheHook'); @delthehook := GetProcAddress(DLLInstance, 'DelTheHook'); end; end; procedure TForm1.btnSetHookClick(Sender: TObject); begin SetTheHook(Handle); end; procedure TForm1.btnUnsetHookClick(Sender: TObject); begin DelTheHook; end; procedure TForm1.FormCreate(Sender: TObject); var Resstrm: TResourceStream; begin Resstrm := TResourceStream.Create(HInstance, 'MYDLL',RT_RCDATA); Resstrm.SaveToFile(ExtractFilePath(Application.ExeName) + DLLname); Resstrm.Free; loadlib; end; procedure TForm1.FormDestroy(Sender: TObject); begin FreeLibrary(DLLInstance); DeleteFile(ExtractFilePath(Application.ExeName) + DLLname); end; procedure TForm1.MyHandler(var msg: TMessage); begin Memo1.Lines.Add(IntToStr(msg.WParam) + ' disabled ...'); end; end.