Code ingediend door Jens Borrisholt. Tekst door Zarko Gajic.
Van Jens: Hooks, ik heb veel mensen zien proberen een schone oplossing te maken voor het koppelen van berichten in een applicatie. Dus besloot ik enige tijd geleden om hooks als een klasse te implementeren, met leuke evenementen en zo :)
Hook.pas maakt het mogelijk om een methode pointer toe te wijzen aan een procedure pointer (met wat hulp van assembler).
Bijvoorbeeld: als u ALLE toetsaanslagen in uw toepassing wilt blokkeren, declareert u eenvoudig een instantie van TKeyboardHook, wijst u een gebeurtenishandler toe voor OnPreExecute of OnPostExecute, of beide. Stel uw KeyboadHook actief in (KeyboardHook.Active: = True) en u bent actief ...
Een hook is een punt in het systeem voor het afhandelen van berichten van het systeem waar een toepassing een subroutine kan installeren om het berichtenverkeer in het systeem te volgen en bepaalde soorten berichten te verwerken voordat ze de doelvensterprocedure bereiken.
Kort gezegd is een hook een functie die u kunt maken als onderdeel van een DLL of uw toepassing om het 'reilen en zeilen' in het Windows-besturingssysteem te volgen.
Het idee is om een functie te schrijven die wordt aangeroepen telkens wanneer een bepaalde gebeurtenis in Windows plaatsvindt - bijvoorbeeld wanneer een gebruiker op een toets op het toetsenbord drukt of de muis beweegt.
Voor een meer diepgaande inleiding tot haken, bekijk wat Windows-haken zijn en hoe ze te gebruiken in een Delphi-toepassing.
Hooking-mechanisme is afhankelijk van Windows-berichten en callback-functies.
Bijvoorbeeld:
U kunt de WH_KEYBOARD-haak gebruiken om toetsenbordinvoer te controleren die in een berichtenwachtrij is geplaatst;
U kunt de WH_MOUSE-haak gebruiken om muisinvoer in een berichtenwachtrij te controleren;
U kunt een WH_SHELL-haakprocedure uitvoeren wanneer de shell-toepassing wordt geactiveerd en wanneer een venster op het hoogste niveau wordt gemaakt of vernietigd.
Download hooks.pas + demo-applicatie
gebruikt haken, ...
var
KeyboardHook: TKeyboardHook;
...
// MainForm's OnCreate event handlerprocedure TMainForm.FormCreate (Sender: TObject);
beginnen
KeyboardHook: = TKeyboardHook.Create;
KeyboardHook.OnPreExecute: = KeyboardHookPREExecute;
KeyboardHook.Active: = True;
einde;
// behandelt KeyboardHook's OnPREExecuteprocedure TMainForm.KeyboardHookPREExecute (Hook: THook; var Hookmsg: THookMsg);
var
Sleutel: Woord;
beginnen
// Hier kunt u kiezen of u // de toetsaanslag naar de toepassing wilt retourneren of niet
Hookmsg.Result: = IfThen (cbEatKeyStrokes.Checked, 1, 0);
Sleutel: = Hookmsg.WPARAM;
Bijschrift: = Char (sleutel);
einde;
Klaar, ingesteld, haak :)