DANK Delphi Class met broncode

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

Op Windows Hooks

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.

Soorten haken

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.

Hooks.pas

  • TCBTHook - aangeroepen voordat een venster wordt geactiveerd, gemaakt, vernietigd, geminimaliseerd, gemaximaliseerd, verplaatst of aangepast; voordat u een systeemopdracht uitvoert; voordat u een muis- of toetsenbordgebeurtenis uit de systeemberichtenwachtrij verwijdert; voordat u de invoerfocus instelt; of voordat u synchroniseert met de berichtenwachtrij van het systeem.
  • TDebugHook - aangeroepen voordat hook-procedures worden aangeroepen die aan een andere hook in het systeem zijn gekoppeld
  • TGetMessageHook - hiermee kan een toepassing berichten controleren die worden geretourneerd door de GetMessage- of PeekMessage-functie
  • TJournalPlaybackHook - hiermee kan een toepassing berichten in de berichtenwachtrij van het systeem invoegen.
  • TJournalRecordHook - hiermee kunt u invoergebeurtenissen volgen en opnemen (om een ​​reeks muis- en toetsenbordgebeurtenissen op te nemen en later af te spelen met de WH_JOURNALPLAYBACK-haak).
  • TKeyboardHook - hiermee kan een toepassing berichtenverkeer controleren op WM_KEYDOWN- en WM_KEYUP-berichten.
  • TMouseHook - hiermee kunt u muisberichten volgen die worden geretourneerd door de functie GetMessage of PeekMessage.
  • TLowLevelKeyboardHook - hiermee kunt u toetsenbordinvoergebeurtenissen controleren die binnenkort in een threadinvoerwachtrij worden geplaatst.
  • TLowLevelMouseHook - hiermee kunt u muisinvoergebeurtenissen volgen die binnenkort in een threadinvoerwachtrij worden geplaatst.

TKeyboardHook-voorbeeld

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 :)