Zachytávanie klávesnice pomocou Delphi

click fraud protection

Zvážte chvíľku vytvorenia rýchlej arkádovej hry. Celá grafika sa zobrazí, povedzme, v TPainBoxe. TPaintBox nedokáže získať vstupné zameranie - po stlačení klávesu užívateľ nespustí žiadne udalosti; nemôžeme zachytiť kurzorové klávesy, aby sme presunuli našu bojovú loď. Delphi Pomoc!

Intercept Keyboard Input

Väčšina aplikácií Delphi zvyčajne spracováva vstup používateľa pomocou obsluhy konkrétnych udalostí, ktoré nám umožňujú zachytiť používateľa stlačenia klávesov a proces pohyb myši.

Vieme, že zameranie je schopnosť získať vstup od používateľa pomocou myši alebo klávesnice. Len objekt, ktorý má fokus, môže prijať udalosť klávesnice. Niektoré ovládacie prvky, napríklad TImage, TPaintBox, TPanel a TLabel, nemôžu zaostriť. Hlavným účelom väčšiny grafických ovládacích prvkov je zobrazenie textu alebo grafiky.

Ak chceme zachytiť vstup z klávesnice pre ovládacie prvky, ktoré nemôžu získať vstupné zameranie, musíme sa zaoberať rozhraním Windows API, háčikmi, spätným volaním a správy.

Okná Háčiky

instagram viewer

Technicky je funkcia „háčik“ funkciou spätného volania, ktorú je možné vložiť do správy systému Windows systém, aby aplikácia mohla pristupovať k toku správ skôr, ako sa vykoná ďalšie spracovanie správy miesto. Medzi mnohými typmi háčikov systému Windows sa vždy, keď aplikácia volá, zavolá klávesnica GetMessage () alebo PeekMessage () a existuje klávesová správa WM_KEYUP alebo WM_KEYDOWN proces.

Aby sme vytvorili háčik klávesnice, ktorý zachytí všetok vstup z klávesnice nasmerovaný na dané vlákno, musíme zavolať SetWindowsHookEx Funkcia API. Rutiny, ktoré prijímajú udalosti klávesnice, sú aplikácie definované na spätné volanie nazývané funkcie zavesenia (KeyboardHookProc). Systém Windows volá funkciu zavesenia pre každú správu stlačenia klávesu (kláves hore a dole) pred umiestnením správy do frontu správ aplikácie. Funkcia háčika môže spracovať, zmeniť alebo vyradiť stlačenia klávesov. Háčiky môžu byť miestne alebo globálne.

návratová hodnota aplikácie SetWindowsHookEx je rukoväť práve nainštalovaného háčika. Pred ukončením musí žiadosť zavolať na UnhookWindowsHookEx uvoľniť systémové prostriedky spojené s háčikom.

Príklad háčika na klávesnici

Ako ukážku háčikov klávesnice vytvoríme projekt s grafickým ovládaním, ktorý dokáže stlačiť klávesy. TImage je odvodený od TGraphicControl, dá sa použiť ako kresliaca plocha pre našu hypotetickú bojovú hru. Pretože TImage nedokáže prijímať klávesové skratky prostredníctvom štandardných udalostí klávesnice, vytvoríme funkciu zavesenia, ktorá zachytí všetky vstupy klávesnice smerované na náš povrch kreslenia.

TImage Spracovanie udalostí klávesnice

Začať nový Projekt Delphi a umiestnite jeden komponent obrázka do formulára. Vlastnosť Image1.Align nastavte na alClient. To je z vizuálnej časti, teraz musíme urobiť nejaké kódovanie. Najprv potrebujeme nejaké globálne premenné:

 var
Forma 1: TForm1;
KBHook: HHook; {to zachytáva vstup z klávesnice}
cx, cy: celé číslo; {sledovať polohu bojovej lode}
{vyhlásenie o spätnom volaní}
function KeyboardHookProc (Kód: Integer; WordParam: Word; LongParam: LongInt): LongInt; STDCALL;
uskutočnenie
...

Ak chcete nainštalovať háčik, nazývame SetWindowsHookEx v prípade OnCreate formulára.

 postup TForm1.FormCreate (odosielateľ: TObject);
začať
{Nastavte háčik na klávesnicu, aby sme mohli zachytiť vstup z klávesnice}
KBHook: = SetWindowsHookEx (WH_KEYBOARD,
{callback>} @ KeyboardHookProc,
hInstance,
GetCurrentThreadId ());
{umiestnite bojovú loď do stredu obrazovky}
cx: = Image1.ClientWidth div 2;
cy: = Image1.ClientHeight div 2;
Image1.Canvas. PenPos: = bod (cx, cy);
koniec;

Aby sme uvoľnili systémové prostriedky spojené s háčikom, musíme zavolať funkciu UnhookWindowsHookEx v udalosti OnDestroy:

 postup TForm1.FormDestroy (odosielateľ: TObject);
začať
{zrušte zachytenie klávesnice}
UnHookWindowsHookEx (KBHook);
koniec;

Najdôležitejšou časťou tohto projektu je Postup spätného volania na klávesnici KeyboardHookProc používa sa na spracovanie stlačení klávesov.

 function KeyboardHookProc (Kód: Integer; WordParam: Word; LongParam: LongInt): LongInt;
začať
prípade WordParam z
vk_Space: {vymazať cestu bojovej lode}
začať
s Form1.Image1.Canvas
začať
Kefa. Farba: = clWhite;
Kefa. Štýl: = bsSolid;
Fillrect (Form1.Image1.ClientRect);
koniec;
koniec;
vk_Right: cx: = cx + 1;
vk_Left: cx: = cx-1;
vk_Up: cy: = cy-1;
vk_Down: cy: = cy + 1;
koniec; {Prípad}
Ak cx <2, potom cx: = Form1.Image1.ClientWidth-2;
Ak cx> Form1.Image1.ClientWidth -2 potom cx: = 2;
Ak cy <2, potom cy: = Form1.Image1.ClientHeight -2;
Ak cy> Form1.Image1.ClientHeight-2 potom cy: = 2;
s Form1.Image1.Canvas
začať
Pen. Farba: = clRed;
Kefa. Farba: = clYellow;
TextOut (0,0, formát ('% d,% d', [cx, cy]));
Obdĺžnik (cx-2, cy-2, cx + 2, cy + 2);
koniec;
Výsledok: = 0;
{Ak chcete zabrániť systému Windows v odovzdávaní stlačení kláves do cieľového okna, hodnota výsledku musí byť nenulová hodnota.}
koniec;

To je všetko. Teraz máme konečný kód na spracovanie klávesnice.

Všimnite si iba jednu vec: tento kód nie je nijako obmedzený na použitie iba s programom TImage.

Funkcia KeyboardHookProc slúži ako všeobecný mechanizmus KeyPreview & KeyProcess.

instagram story viewer