Haka musen för att fånga händelser utanför en applikation

click fraud protection

Lär dig hur du spårar musaktiviteten även om din Delphi-applikation inte är aktiv, sitter i bricka eller gör inte har någon UI alls.

Genom att installera en systemomfattande (eller global) muskrok kan du övervaka vad användaren gör med mus och agera i enlighet därmed.

Vad är en krok och hur fungerar det?

Kort sagt, en krok är en (ring tillbaka) -funktion du kan skapa som en del av en DLL (dynamisk länkbibliotek) eller din ansökan för att övervaka "fortsätter" i Windows-operativsystemet.
Det finns två typer av krokar - globala och lokala. En lokal krok övervakar saker som händer bara för ett specifikt program (eller tråd). En global krok övervakar hela systemet (alla trådar).

För att skapa en global krok behöver du 2 projekt, 1 för att göra den körbara filen och 1 för att skapa en DLL som innehåller hook-proceduren.

Vår artikel om arbetar med tangentbordskrokar från Delphi förklarar hur man fångar tangentbordets ingång för kontroller som inte kan ta emot inmatningsfokus (som TImage).

Haka musen

instagram viewer

Genom design är musens rörelse begränsad av storleken på din skrivbordsskärm (inklusive Windows Aktivitetsfält). När du flyttar musen till vänster / höger / övre / nedre kanten "stoppar" musen - som förväntat (om du inte har mer än en bildskärm).

Här är en idé för den systembreda muskroken: Om du till exempel vill flytta musen till höger på skärmen när den rör sig mot vänster kant (och "berör" den) kan du skriva en global muskrok för att flytta musen igen pekare.

Du börjar med att skapa ett dynamiskt länkbiblioteksprojekt. DLL ska exportera två metoder: "HookMouse" och "UnHookMouse".

HookMouse-förfarandet kallar SetWindowsHookEx API passerar "WH_MOUSE" för den första parametern - installerar därmed en krokprocedur som övervakar musmeddelanden. En av parametrarna för SetWindowsHookEx är din återuppringningsfunktion Windows kommer att ringa när det finns ett musmeddelande som ska behandlas:

SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);

Den sista parametern (värde = 0) i SetWindowsHookEx definierar att vi registrerar en global krok.

HookProc analyserar de musrelaterade meddelandena och skickar ett anpassat meddelande ("MouseHookMessage") till vårt testprojekt:

fungera HookProc (nKod: heltal; MsgID: WParam; Data: LParam): LResult; stdcall;

var

 mousePoint: TPoint;

 meddelaTestForm: boolean;

 MouseDirection: TMouseDirection;

Börja

 mousePoint: = PMouseHookStruct (Data) ^. pt;


 notifyTestForm: = falsk;


om (MousePoint. X = 0) sedan

Börja

 Windows. SetCursorPos (-2 + skärm. Bredd, mousePoint.y);

 notifyTestForm: = true;

 MouseDirection: = mdRight;

slutet;

...
om notifyTestForm sedan

Börja

 PostMessage (FindWindow ('TMainHookTestForm', nil), MouseHookMessage, MsgID, Integer (MouseDirection));

slutet;

Resultat: = CallNextHookEx (Hook, nCode, MsgID, Data);
slutet;

Dricks: Läs Win32 SDK Hjälp-filer för att ta reda på PMouseHookStruct-posten och signaturen för HookProc-funktionen.

Notera: En krokfunktion behöver inte skicka något någonstans - PostMessage-samtalet används bara för att indikera att DLL kan kommunicera med den "yttre" världen.

Muskrok "Lyssnare"

Meddelandet "MouseHookMessage" läggs till ditt testprojekt - ett formulär med namnet "TMainHookTestForm". Du åsidosätter WndProc-metoden för att få meddelandet och agera vid behov:

procedur TMainHookTestForm. WndProc (var Meddelande: TMessage);

Börja

ärvt WndProc (meddelande);

om Meddelande. Msg = HookCommon. MouseHookMessage sedan

Börja

// implementering finns i den medföljande koden

 Signal (TMouseDirection (meddelande. LParam));

slutet;

slutet;

Naturligtvis när formen skapas (OnCreate) kallar du HookMouse-proceduren från DLL, när den stängs (OnDestroy) kallar du UnHookMouse-proceduren.

Obs: Krokar tenderar att bromsa systemet eftersom de ökar mängden bearbetning som systemet måste utföra för varje meddelande. Du bör bara installera en krok när det är nödvändigt och ta bort den så snart som möjligt.

instagram story viewer