Näppäimistötulon sieppaaminen Delphin kanssa

click fraud protection

Harkitse hetkeksi nopean arcade-pelin luomista. Kaikki grafiikat näytetään, sanotaanpa, TPainBoxissa. TPaintBox ei pysty vastaanottamaan syöttötarkennusta - tapahtumia ei välitetä, kun käyttäjä painaa näppäintä; emme voi siepata kohdistinnäppäimiä taistelulaivamme siirtämiseksi. Delfoi auta!

Sieppaa näppäimistön syöttö

Useimmat Delphi-sovellukset käsittelevät käyttäjän syötteitä tyypillisesti erityisten tapahtumakäsittelyjen kautta, jotka antavat meille mahdollisuuden kaapata käyttäjä painalluksia ja prosessi hiiren liikettä.

Tiedämme, että keskittyminen on kyky vastaanottaa käyttäjän syötteitä hiiren tai näppäimistön kautta. Vain Kohde, jolla on tarkennus, voi vastaanottaa näppäimistötapahtuman. Jotkut säätimet, kuten TImage, TPaintBox, TPanel ja TLabel, eivät pysty vastaanottamaan tarkennusta. Useimpien graafisten säätimien ensisijainen tarkoitus on näyttää tekstiä tai grafiikkaa.

Jos haluamme siepata näppäimistön syötteet säätimille, jotka eivät pysty vastaanottamaan syöttötarkennusta, meidän on käsiteltävä Windows-sovellusliittymää, koukkuja, takaisinsoittoja ja viestien.

instagram viewer

Windows-koukut

Teknisesti "koukku" -toiminto on takaisinsoitto-toiminto, joka voidaan lisätä Windows-viestiin järjestelmä, jotta sovellus voi käyttää viestivirtaa ennen kuin viestin muu käsittely tapahtuu paikka. Monien ikkunakoukkujen joukosta näppäimistökoukkua kutsutaan aina, kun sovellus soittaa GetMessage () tai PeekMessage () -toiminto ja WM_KEYUP- tai WM_KEYDOWN-näppäimistöviesti on käsitellä asiaa.

Jotta voimme luoda näppäimistökoukun, joka katkaisee kaikki tiettyyn säieeseen suunnatut näppäimistötulot, meidän on soitettava SetWindowsHookEx API-toiminto. Rutiinit, jotka vastaanottavat näppäimistötapahtumat, ovat sovelluksen määrittelemiä takaisinsoitto-toimintoja, joita kutsutaan koukutoiminnoiksi (KeyboardHookProc). Windows soittaa koukkutoimintoasi jokaiselle näppäinpainallukselle (näppäin ylös ja alas) ennen kuin viesti asetetaan sovelluksen viestijonoon. Koukutoiminto voi käsitellä, muuttaa tai hylätä näppäinpainalluksia. Koukut voivat olla paikallisia tai globaaleja.

palautusarvo of SetWindowsHookEx on juuri asennetun koukun kahva. Ennen lopettamista sovelluksen on soitettava UnhookWindowsHookEx toiminto vapauttaa koukkuun liittyvät järjestelmäresurssit.

Näppäimistökoukkuesimerkki

Näppäimistökoukkujen esittelynä luomme graafisen ohjauksen omaavan projektin, joka voi vastaanottaa näppäinpainalluksia. TImage on johdettu TGraphicControlista, sitä voidaan käyttää piirustuspinnana hypoteettiseen taistelupelissämme. Koska TImage ei pysty vastaanottamaan näppäimistön painikkeita tavallisten näppäimistötapahtumien kautta, luomme koukutoiminnon, joka sieppaa kaikki näppäimistön tulot, jotka on suunnattu piirustuspintaan.

TImage Processing Keyboard Events

Aloita uusi Delphi-projekti ja aseta yksi kuvakomponentti lomakkeelle. Aseta Image1.Align omaisuudeksi alClient. Se on se visuaalinen osa, nyt meidän on tehtävä joitain koodauksia. Ensinnäkin tarvitsemme joitain globaalit muuttujat:

 var
Muoto 1: TForm1;
KBHook: HHook; {tämä sieppaa näppäimistön sisäänmenon}
cx, cy: kokonaisluku; {seurata taistelualuksen sijaintia}
{takaisinsoittoilmoitus}
toiminto KeyboardHookProc (koodi: kokonaisluku; WordParam: Word; LongParam: LongInt): LongInt; stdcall;
toteutus
...

Asentaaksesi koukun kutsumme SetWindowsHookEx-muotoa lomakkeen OnCreate-tapahtumassa.

 menettely TForm1.FormCreate (Lähettäjä: TObject);
alkaa
{Aseta näppäimistön koukku niin, että pystymme sieppaamaan näppäimistön syötteen}
KBHook: = SetWindowsHookEx (WH_KEYBOARD,
{soittopyyntö>} @KeyboardHookProc,
HInstance,
GetCurrentThreadId ());
{aseta taistelulaiva näytön keskelle}
cx: = Image1.ClientWidth div 2;
cy: = Image1.ClientHeight div 2;
Image1.Canvas. PenPos: = piste (cx, cy);
end;

Koukkuun liittyvien järjestelmäresurssien vapauttamiseksi meidän on kutsuttava UnhookWindowsHookEx-toimintoon OnDestroy-tapahtumassa:

 menettely TForm1.FormDestroy (Lähettäjä: TObject);
alkaa
{avaa näppäimistön sieppaaminen}
UnHookWindowsHookEx (KBHook);
end;

Tärkein osa tätä hanketta on KeyboardHookProc -soittopyyntö käytetään näppäimistön käsittelemiseen.

 toiminto KeyboardHookProc (koodi: kokonaisluku; WordParam: Word; LongParam: LongInt): LongInt;
alkaa
tapaus WordParam of
vk_Space: {poista taistelulaivan polku}
alkaa
kanssa Form1.Image1.Canvas tehdä
alkaa
Harjata. Väri: = clWhite;
Harjata. Tyyli: = bsSolid;
Täytä oikein (Lomake1.Kuva1.Klientitiedot);
end;
end;
vk_oikeus: cx: = cx + 1;
vk_vasen: cx: = cx-1;
vk_Up: cy: = cy-1;
vk_Down: cy: = cy + 1;
end; {Kotelon}
Jos cx <2, niin cx: = Muoto1.Kuva1.Klientin leveys-2;
Jos cx> Muoto1.Kuva1.Kesäleveys -2, silloin cx: = 2;
Jos cy <2, niin cy: = Muoto1.Kuva1.Keskijäkorkeus -2;
Jos cy> muoto1.Kuva1.ClientHeight-2, sitten cy: = 2;
kanssa Form1.Image1.Canvas tehdä
alkaa
Kynä. Väri: = CLRED;
Harjata. Väri: = clYellow;
TextOut (0,0, muoto ('% d,% d', [cx, cy]));
Suorakulmio (cx-2, cy-2, cx + 2, cy + 2);
end;
Tulos: = 0;
{Jotta Windows ei estä näppäinpainalluksia kohdeikkunaan, Tulos-arvon on oltava nolla-arvoinen.}
end;

Se siitä. Meillä on nyt lopullinen näppäimistön käsittelykoodi.

Huomaa vain yksi asia: tätä koodia ei ole mitenkään rajoitettu käytettäväksi vain TImagen kanssa.

KeyboardHookProc-toiminto toimii yleisenä KeyPreview & KeyProcess -mekanismina.

instagram story viewer