Opi seuraamaan hiiren toimintaa myös silloin, kun Delphi-sovelluksesi ei ole aktiivinen, istuu tarjotin tai ei ei ole mitään käyttöliittymää ollenkaan.
Asentamalla koko järjestelmän (tai globaalin) hiirikoukun voit seurata, mitä käyttäjä tekee hiiri ja toimia vastaavasti.
Mikä on koukku ja miten se toimii?
Lyhyesti sanottuna, koukku on (soita takaisin) -toiminto, jonka voit luoda osana DLL (dynaaminen linkkikirjasto) tai sovelluksesi seurata Windows-käyttöjärjestelmän sisäistä toimintaa.
Koukkuja on 2 tyyppiä - globaalit ja paikalliset. Paikallinen koukku tarkkailee asioita, jotka tapahtuvat vain tietylle ohjelmalle (tai säikeelle). Globaali koukku seuraa koko järjestelmää (kaikki kierteet).
Globaalin koukun luomiseen tarvitaan 2 hanketta, 1 suoritettavan tiedoston luomiseksi ja 1 koukutusproseduuria sisältävän DLL: n luomiseksi.
Artikkelimme aiheesta työskentely Delphin näppäimistökoukkujen kanssa selittää kuinka siepata näppäimistön tulo hallintalaitteille, jotka eivät pysty vastaanottamaan syöttötarkennusta (kuten TImage).
Hiiren kiinnittäminen
Suunnittelun mukaan hiiren liikettä rajoittaa työpöydän näytön koko (mukaan lukien Windowsin tehtäväpalkki). Kun siirrät hiiren vasemmalle / oikealle / ylä / alareunaan, hiiri "pysähtyy" - odotetusti (jos sinulla ei ole useampaa kuin yhtä näyttöä).
Tässä on idea koko järjestelmän kattavasta hiirikoukusta: Jos esimerkiksi haluat siirtää hiiren näytön oikealle puolelle. kun se liikkuu kohti vasenta reunaa (ja "koskettaa" sitä), saatat kirjoittaa globaalin hiiren koukun hiiren sijoittamiseksi uudelleen osoitin.
Aloitat luomalla dynaamisen linkkikirjastoprojektin. DLL: n pitäisi viedä kaksi tapaa: "HookMouse" ja "UnHookMouse".
HookMouse-menettely kutsuu SetWindowsHookEx Sovellusliittymä, joka ohittaa WH_MOUSE: n ensimmäiselle parametrille - asentaa siten koukkuproseduurin, joka seuraa hiiren viestejä. Yksi SetWindowsHookEx-parametrista on takaisinsoitto-toimintosi, jonka Windows soittaa, kun käsiteltävänä oleva hiiren viesti on:
SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);
SetWindowsHookEx-sovelluksen viimeinen parametri (arvo = 0) määrittelee, rekisteröimmekö globaalin koukun.
HookProc jäsentää hiiren liittyviä viestejä ja lähettää mukautetun viestin ("MouseHookMessage") testiprojektiimme:
toimia HookProc (nCode: Kokonaisluku; MsgID: WParam; Tiedot: LParam): LResult; stdcall;
var
mousePoint: TPoint;
ilmoitaTestForm: boolean;
MouseDirection: TMouseDirection;
alkaa
mousePoint: = PMouseHookStruct (Data) ^. pt;
ilmoitaTestForm: = väärä;
jos (MousePoint. X = 0) sitten
alkaa
Windows. SetCursorPos (-2 + näyttö. Leveys, mousePoint.y);
ilmoitaTestForm: = totta;
MouseDirection: = mdRight;
pää;
...
jos notifyTestForm sitten
alkaa
PostMessage (FindWindow ('TMainHookTestForm', nolla), MouseHookMessage, MsgID, Integer (MouseDirection));
pää;
Tulos: = CallNextHookEx (Hook, nCode, MsgID, Data);
pää;
Kärki: Lue Win32 SDK -ohjetiedostot saadaksesi tietoa PMouseHookStruct-tietueesta ja HookProc-toiminnon allekirjoituksesta.
Huomautus: Koukutoiminnon ei tarvitse lähettää mitään mihinkään - PostMessage-puhelua käytetään vain osoittamaan, että DLL voi kommunikoida "ulkoisen" maailman kanssa.
Hiirikoukku "Kuuntelija"
"MouseHookMessage" -viesti lähetetään testiprojektiisi - muotoon nimeltä "TMainHookTestForm". Ohitat WndProc-menetelmän saadaksesi viestin ja toimia tarvittaessa:
menettely TMainHookTestForm. WndProc (var Viesti: TMessage);
alkaa
peritty WndProc (viesti);
jos Viesti. Msg = HookCommon. MouseHookMessage sitten
alkaa
// toteutus löytyy mukana olevasta koodista
Signaali (TMouseDirection (viesti. LParam));
pää;
pää;
Tietysti, kun lomake luodaan (OnCreate), soitat HookMouse-menettelylle DLL: stä, kun se suljetaan (OnDestroy), soitat UnHookMouse-menettelyyn.
Huomaa: Koukut pyrkivät hidastamaan järjestelmää, koska ne lisäävät prosessoinnin määrää, jonka järjestelmän on suoritettava jokaiselle viestille. Asenna koukku vain tarvittaessa ja poista se mahdollisimman pian.