TILL Delphi Class med källkod

Koden lämnad av Jens Borrisholt. Text av Zarko Gajic.

Av Jens: Hooks, jag har sett många människor försöka göra en ren lösning för att ansluta meddelanden i en applikation. Så jag bestämde mig för en tid sedan att implementera krokar som en klass, med trevliga evenemang och grejer :)

Hook.pas gör det möjligt att tilldela en metodpekare till en procedurpekare (med lite hjälp från monteraren).

Till exempel: om du vill fånga ALLA tangenttryckningar i din applikation - förklar bara en förekomst av TKeyboardHook, tilldela en händelseshanterare för OnPreExecute eller OnPostExecute, eller båda. Ställ in KeyboadHook aktiv (KeyboardHook.Active: = True) och du är ute och kör ...

På Windows Hooks

En krok är en punkt i systemmeddelandehanteringsmekanismen där en applikation kan installera en subroutine för att övervaka meddelandetrafiken i systemet och bearbeta vissa typer av meddelanden innan de når målfönstret.

Kort sagt är en krok en funktion som du kan skapa som en del av en dll eller din applikation för att övervaka "händelserna" i Windows operativsystem.

Tanken är att skriva en funktion som kallas varje gång en viss händelse i windows inträffar - till exempel när en användare trycker på en tangent på tangentbordet eller flyttar musen.

För en mer djupgående introduktion till krokar, titta på vad Windows-krokar är och hur du använder dem i en Delphi-applikation.

Kopplingsmekanismen är beroende av Windows-meddelanden och återuppringningsfunktioner.

Typer av krokar

Till exempel:
Du kan använda WH_KEYBOARD-kroken för att övervaka tangentbordsinmatningen som är postad i en meddelandekö;
Du kan använda WH_MOUSE-kroken för att övervaka musinmatningen som är postad i en meddelandekö;
Du kan ha en WH_SHELL krokprocedur när skalapplikationen håller på att aktiveras och när ett toppfönster skapas eller förstörs.

Hooks.pas

  • TCBTHook - anropad innan du aktiverar, skapar, förstör, minimerar, maximerar, flyttar eller dimensionerar ett fönster; innan du slutför ett systemkommando; innan du tar bort en mus- eller tangentbordshändelse från systemmeddelandekön; innan du ställer in fokusen; eller innan du synkroniserar med systemmeddelandekön.
  • TDebugHook - uppringd innan du anropar krokprocedurer associerade med någon annan krok i systemet
  • TGetMessageHook - gör det möjligt för en applikation att övervaka meddelanden som ska returneras av GetMessage eller PeekMessage-funktionen
  • TJournalPlaybackHook - gör det möjligt för ett program att infoga meddelanden i systemmeddelandekön.
  • TJournalRecordHook - gör det möjligt för dig att övervaka och spela in händelser (för att spela in en sekvens av mus- och tangentbordshändelser för att spela upp senare med WH_JOURNALPLAYBACK Hook).
  • TKeyboardHook - gör det möjligt för ett program att övervaka meddelandetrafik för WM_KEYDOWN och WM_KEYUP meddelanden.
  • TMouseHook - gör det möjligt för dig att övervaka musmeddelanden som ska returneras med GetMessage eller PeekMessage-funktionen.
  • TLowLevelKeyboardHook - gör det möjligt för dig att övervaka tangentbordsinmatningshändelser som ska läggas upp i en trådingångskö.
  • TLowLevelMouseHook - gör det möjligt för dig att övervaka musinmatningshändelser som ska läggas upp i en trådingångskö.

Exempel på TKeyboardHook

Ladda ner hooks.pas + demo-applikation

 använder krokar, ...
var
  KeyboardHook: TKeyboardHook;
...
// MainForms OnCreate-evenemangshanterare-procedur TMainForm.FormCreate (avsändare: TObject);
Börja
  KeyboardHook: = TKeyboardHook.Create;
  KeyboardHook.OnPreExecute: = KeyboardHookPREExecute;
  KeyboardHook.Active: = True;
slutet;
// hanterar KeyboardHook's OnPREExecuteprocedure TMainForm.KeyboardHookPREExecute (Hook: THook; var Hookmsg: THookMsg);
var
  Nyckel: Word;
Börja
  // Här kan du välja om du vill returnera // nyckelslag till applikationen eller inte
  Hookmsg.Result: = IfThen (cbEatKeyStrokes.Checked, 1, 0);
  Nyckel: = Hookmsg.WPARAM;
  Bildtext: = Char (nyckel);
slutet;

Klar, set, krok :)