Siit saate teada, kuidas jälgida hiire tegevust ka siis, kui teie Delphi rakendus pole aktiivne kandik või teeb teil pole ühtegi kasutajaliidest üleüldse.
Paigaldades kogu süsteemi hõlmava (või globaalse) hiirekonksu, saate jälgida, mida kasutaja teeb hiir ja käitu vastavalt.
Mis on konks ja kuidas see töötab?
Lühidalt öeldes on konks (helista tagasi) funktsiooni, mille saate luua osana DLL (dünaamiliste linkide kogu) või teie rakendusega Windowsi opsüsteemi sisselülituse jälgimiseks.
Konkse on 2 tüüpi - globaalsed ja kohalikud. Kohalik konks jälgib asju, mis juhtuvad ainult konkreetse programmi (või lõime) jaoks. Globaalne konks jälgib kogu süsteemi (kõiki niite).
Globaalse konksu loomiseks vajate 2 projekti, 1 käivitatava faili ja 1 DLL-id, mis sisaldab konksu protseduuri.
Meie artikkel töö Delphi klaviatuurikonksudega selgitab, kuidas pealtkuulata klaviatuuri sisendit juhtseadiste jaoks, mis ei saa sisendfookust vastu võtta (näiteks TImage).
Hiire haakimine
Kujunduslikult piirab hiire liikumist teie töölaua ekraani suurus (sealhulgas Windowsi tegumiriba). Kui liigutate hiirt vasakule / paremale / ülemisele / alumisele servale, siis hiir "peatub" - ootuspäraselt (kui teil pole rohkem kui ühte monitori).
Siit leiate idee kogu süsteemi hõlmava hiirekonksu jaoks: näiteks kui soovite hiirt liigutada ekraani paremale servale kui see liigub vasaku serva poole (ja "puudutab" seda), võite hiire ümberpaigutamiseks kirjutada globaalse hiirekonksu osuti.
Alustate dünaamiliste linkide raamatukogu projekti loomisega. DLL peaks eksportima kahte meetodit: "HookMouse" ja "UnHookMouse".
HookMouse protseduur kutsub välja SetWindowsHookEx API läbib esimese parameetri jaoks WH_MOUSE - installides seega konksu protseduuri, mis jälgib hiireteateid. SetWindowsHookExi üks parameetreid on teie tagasihelistamise funktsioon, mille Windows helistab, kui töödeldakse hiireteadet:
SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);
SetWindowsHookExi viimane parameeter (väärtus = 0) määratleb globaalse konksu registreerimise.
HookProc sõelub hiirega seotud sõnumid ja saadab kohandatud sõnumi ("MouseHookMessage") meie testprojektile:
funktsiooni HookProc (nCode: täisarv; MsgID: WParam; Andmed: LParam): LResult; stdcall;
var
mousePoint: TPoint;
teavitadaTestForm: tõeväärtus;
MouseDirection: TMouseDirection;
alustada
mousePoint: = PMouseHookStruct (Data) ^ pt;
teavitadaTestForm: = vale;
kui (hiirePunkt. X = 0) siis
alustada
Windows. SetCursorPos (-2 + ekraan. Laius, mousePoint.y);
teavitadaTestForm: = tõsi;
MouseDirection: = mdRight;
lõpp;
...
kui teavitaTestForm siis
alustada
PostMessage (FindWindow ('TMainHookTestForm', null), MouseHookMessage, MsgID, Integer (MouseDirection));
lõpp;
Tulemus: = CallNextHookEx (konks, nCode, MsgID, andmed);
lõpp;
Näpunäide: PMouseHookStruct kirje ja funktsiooni HookProc allkirja kohta lisateabe saamiseks lugege Win32 SDK abifaile.
Märge: Konksufunktsioon ei pea midagi kuskilt saatma - PostMessage'i kõnet kasutatakse ainult selleks, et näidata, et DLL suudab suhelda "välismaailmaga".
Hiirekonks "Kuulaja"
Teie testprojekti postitatakse teade "MouseHookMessage" - vorm nimega "TMainHookTestForm". Saate sõnumi saamiseks ja vastavalt vajadusele WndProc'i meetodi alistada:
protseduur TMainHookTestForm. WndProc (var Sõnum: TMessage);
alustada
päritud WndProc (teade);
kui Sõnum. Msg = HookCommon. MouseHookMessage siis
alustada
// kaasasolevas koodis leitud teostus
Signaal (TMouseDirection (teade. LParam));
lõpp;
lõpp;
Muidugi, kui vorm on loodud (OnCreate), siis helistate DLL-ist HookMouse'i protseduurile, kui see suletakse (OnDestroy), siis helistate UnHookMouse-protseduurile.
Märkus. Konksud kipuvad süsteemi aeglustama, kuna need suurendavad töötlemismahtu, mida süsteem peab iga teate jaoks tegema. Peaksite konksu paigaldama ainult vajadusel ja eemaldage see nii kiiresti kui võimalik.