Uzziniet, kā izsekot peles darbībām pat tad, ja jūsu Delphi lietojumprogramma nav aktīva, tā atrodas paplāte vai dara nav nevienas lietotāja saskarnes pavisam.
Instalējot visas sistēmas (vai globālo) peles āķi, jūs varat uzraudzīt, ko lietotājs dara ar pele un rīkojieties atbilstoši.
Kas ir āķis un kā tas darbojas?
Īsāk sakot, āķis ir (atzvani) funkciju, kuru varat izveidot kā daļu no DLL (dinamisko saišu bibliotēka) vai jūsu lietojumprogrammai, lai uzraudzītu “notiekošo” Windows operētājsistēmā.
Ir 2 veidu āķi - globālie un vietējie. Vietējais āķis uzrauga lietas, kas notiek tikai ar noteiktu programmu (vai pavedienu). Globāls āķis uzrauga visu sistēmu (visus pavedienus).
Lai izveidotu globālu āķi, nepieciešami 2 projekti, 1 - izpildāmā faila izveidošanai un 1 - DLL, kas satur āķa procedūru.
Mūsu raksts par darbs ar klaviatūras āķiem no Delphi paskaidro, kā pārtvert tastatūras ievadi vadības ierīcēm, kuras nevar saņemt ievades fokusu (piemēram, TImage).
Aizķerot peli
Pēc dizaina peles kustību ierobežo darbvirsmas ekrāna lielums (ieskaitot Windows uzdevumu joslu). Pārvietojot peli uz kreiso / labo / augšējo / apakšējo malu, pele "apstāsies" - kā paredzēts (ja jums nav vairāk par vienu monitoru).
Šeit ir ideja par visas sistēmas peles āķi: ja, piemēram, vēlaties pārvietot peli uz ekrāna labo pusi kad tā virzās uz kreiso malu (un "pieskaras" tai), jūs varētu uzrakstīt globālu peles āķi, lai peles novietošanu rādītājs.
Vispirms izveidojiet dinamisko saišu bibliotēkas projektu. DLL jāeksportē divas metodes: "HookMouse" un "UnHookMouse".
HookMouse procedūra izsauc SetWindowsHookEx API, kas pirmajam parametram nodod WH_MOUSE, tādējādi instalējot āķa procedūru, kas uzrauga peles ziņojumus. Viens no SetWindowsHookEx parametriem ir jūsu atzvanīšanas funkcija, kurai Windows piezvanīs, kad būs apstrādājams peles ziņojums:
SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);
Pēdējais parametrs (vērtība = 0) SetWindowsHookEx definē, ka mēs reģistrējam globālu āķi.
HookProc parsē peles saistītos ziņojumus un nosūta pielāgotu ziņojumu ("MouseHookMessage") mūsu testa projektam:
funkcija HookProc (nCode: vesels skaitlis; MsgID: WParam; Dati: LParam): LResult; stdcall;
var
mousePoint: TPoint;
informētTestForm: Būla;
MouseDirection: TMouseDirection;
sākt
mousePoint: = PMouseHookStruct (Data) ^ pt;
teavitaTestForm: = nepatiess;
ja (mousePoint. X = 0) tad
sākt
Windows. SetCursorPos (-2 + ekrāns. Platums, mousePoint.y);
teavitaTestForm: = taisnība;
MouseDirection: = mdRight;
beigas;
...
ja paziņotTestForm tad
sākt
PostMessage (FindWindow ('TMainHookTestForm', nulle), MouseHookMessage, MsgID, Integer (MouseDirection));
beigas;
Rezultāts: = CallNextHookEx (Hook, nCode, MsgID, Data);
beigas;
Padoms: Izlasiet Win32 SDK palīdzības failus, lai uzzinātu par PMouseHookStruct ierakstu un funkcijas HookProc parakstu.
Piezīme: Āķa funkcijai nav nepieciešams neko nosūtīt jebkur - PostMessage zvans tiek izmantots tikai, lai norādītu, ka DLL var sazināties ar “ārējo” pasauli.
Peles āķis "Klausītājs"
Jūsu pārbaudes projektā tiek nosūtīts ziņojums "MouseHookMessage" - veidlapa ar nosaukumu "TMainHookTestForm". Jūs ignorēsit WndProc metodi, lai saņemtu ziņojumu un rīkotos pēc nepieciešamības:
procedūra TMainHookTestForm. WndProc (var Ziņojums: TMessage);
sākt
mantots WndProc (Ziņojums);
ja Ziņa. Msg = HookCommon. MouseHookMessage tad
sākt
// ieviešana atrodama pievienotajā kodā
Signāls (TMouseDirection (Ziņojums. LParam));
beigas;
beigas;
Protams, kad veidlapa ir izveidota (OnCreate), jūs izsaucat HookMouse procedūru no DLL, kad tā tiek aizvērta (OnDestroy), jūs izsaucat UnHookMouse procedūru.
Piezīme: Āķiem ir tendence palēnināt sistēmu, jo tie palielina apstrādes daudzumu, kas sistēmai jāveic katram ziņojumam. Āķis jāuzstāda tikai nepieciešamības gadījumā un pēc iespējas ātrāk jānoņem.