Akassza az egeret az események rögzítésére egy alkalmazáson kívül

Megtanulhatja, hogyan lehet nyomon követni az egér tevékenységeit akkor is, ha a Delphi alkalmazás nem aktív, a tálca vagy nem nincs felhasználói felület egyáltalán.

Rendszeres (vagy globális) egérhorog telepítésével ellenőrizheti, hogy a felhasználó mit csinál egér és ennek megfelelően járjon el.

Mi a horog és hogyan működik?

Röviden: a horog egy (visszahív) függvény, amelyet a DLL részeként hozhat létre (dinamikus link könyvtár) vagy az alkalmazás, amellyel figyelemmel kísérheti a Windows működését a Windows operációs rendszerben.
Kétféle horog van - globális és helyi. A helyi horog figyeli a dolgokat, amelyek csak egy adott program (vagy szál) esetében történnek. Globális horog figyeli a teljes rendszert (az összes szálat).

Globális hook létrehozásához 2 projektre van szükség, 1-nek a futtatható fájl létrehozásához és 1-nek a hook-eljárást tartalmazó DLL létrehozásához.

Cikkünk a dolgozik a Delphi billentyűzeteivel elmagyarázza, hogyan lehet elfogni a billentyűzet bemenetét azon kezelőszerveknél, amelyek nem képesek befogadni a bemeneti fókuszt (például a TImage).

instagram viewer

Az egér csatlakoztatása

Tervezés szerint az egér mozgását az asztali képernyő mérete korlátozza (beleértve a Windows tálcát). Ha az egeret balra / jobbra / felső / alsó szélre mozgatja, az egér "megáll" - ahogy az várható volt (ha nem rendelkezik egynél több monitorral).

Íme egy ötlet a rendszerszintű egérhoroghoz: Például, ha az egeret a képernyő jobb oldalára szeretné mozgatni amikor a bal szél felé mozog (és "megérinti"), akkor írhat egy globális egérhorgot az egér áthelyezéséhez mutató.

Először egy dinamikus link könyvtár projektet hoz létre. A DLL-nek két módszert kell exportálnia: "HookMouse" és "UnHookMouse".

A HookMouse eljárás hívja a SetWindowsHookEx Az első paraméterhez a "WH_MOUSE" -ot átadó API - ezzel telepítve egy hook eljárást, amely figyeli az egér üzeneteit. A SetWindowsHookEx egyik paramétere a visszahívási funkció, amelyet a Windows felhív, ha van egy feldolgozandó egérüzenet:

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

A SetWindowsHookEx utolsó paramétere (érték = 0) meghatározza, hogy globális kampót regisztrálunk-e.

A HookProc elemzi az egérrel kapcsolatos üzeneteket, és küld egy egyedi üzenetet ("MouseHookMessage") a tesztprojektünknek:

funkció HookProc (nCode: egész szám; MsgID: WParam; Adatok: LParam): LResult; stdcall;

var

 mousePoint: TPoint;

 teavitazTestForm: logikai;

 MouseDirection: TMouseDirection;

kezdődik

 mousePoint: = PMouseHookStruct (Data) ^. pt;


 teavitazTestForm: = hamis;


ha (MousePoint. X = 0) azután

kezdődik

 Ablakok. SetCursorPos (-2 + képernyő. Szélesség, mousePoint.y);

 értesítTestForm: = igaz;

 MouseDirection: = mdRight;

vég;

...
ha notifyTestForm azután

kezdődik

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

vég;

Eredmény: = CallNextHookEx (Hook, nCode, MsgID, Data);
vég;

Tipp: Olvassa el a Win32 SDK súgófájljait, hogy megismerje a PMouseHookStruct rekordot és a HookProc funkció aláírását.

jegyzet: A horgos funkciónak nem kell semmire küldenie sehova - a PostMessage hívást csak annak jelzésére használják, hogy a DLL képes kommunikálni a „külsõ” világgal.

Egérhorog "Hallgató"

A „MouseHookMessage” üzenet elkerül a tesztprojektedbe - a „TMainHookTestForm” elnevezésű űrlapon. Nem fogja felülírni a WndProc módszert, hogy üzenetet kapjon, és szükség szerint cselekedjen:

eljárás TMainHookTestForm. WndProc (var Üzenet: TMessage);

kezdődik

örökölt WndProc (Üzenet);

ha Üzenet. Msg = HookCommon. MouseHookMessage azután

kezdődik

// a végrehajtás megtalálható a csatolt kódban

 Jel (TMouseDirection (Üzenet). LParam));

vég;

vég;

Természetesen, amikor az űrlap létrejön (OnCreate), akkor meghívja a HookMouse eljárást a DLL-ből, amikor bezáródik (OnDestroy), meghívja az UnHookMouse eljárást.

Megjegyzés: A horgok általában lelassítják a rendszert, mert növelik a feldolgozás mennyiségét, amelyet a rendszernek minden üzenetnél végre kell hajtania. Csak akkor kell felszerelnie a horgot, ha szükséges, és a lehető leghamarabb távolítsa el.

instagram story viewer