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

Lär dig hur du spårar musaktiviteten även om ditt Delphi-program inte är aktivt, sitter i facket eller inte har någon UI alls.

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

Vad är en krok och hur fungerar det?

Kort sagt, en krok är en (återuppringning) -funktion som du kan skapa som en del av ett DLL (dynamiskt länkbibliotek) eller din applikation för att övervaka "händelserna" i Windows operativsystem.
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 att arbeta med tangentbordskrokar från Delphi förklarar hur man kan fånga tangentbordets ingång för kontroller som inte kan få inmatningsfokus (som TImage).

Haka musen

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 / underkant kommer musen att "stoppa" - 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 muspekaren.

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 (nCode: 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 + Screen.Width, 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 Message.Msg = HookCommon.MouseHookMessage sedan

    Börja

      // implementering finns i den medföljande koden

      Signal (TMouseDirection (Message.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.