Zvažte na okamžik vytvoření nějaké rychlé arkádové hry. Veškerá grafika se zobrazí, řekněme, v TPainBoxu. TPaintBox nemůže přijmout fokus vstupu - žádné události se nespustí, když uživatel stiskne klávesu; nemůžeme zachytit kurzorové klávesy pro pohyb naší bitevní lodi. Delphi Pomoc!
Zachycení vstupu klávesnice
Většina aplikací Delphi obvykle zpracovává vstup uživatele prostřednictvím obsluhy konkrétních událostí, těch, které nám umožňují zachytit uživatele stisknutí kláves a zpracovat pohyb myši.
Víme, že důraz je kladen na schopnost přijímat vstup uživatele pomocí myši nebo klávesnice. Pouze objekt, který má fokus, může přijmout událost klávesnice. Některé ovládací prvky, například TImage, TPaintBox, TPanel a TLabel, nemohou být zaostřeny. Hlavním účelem většiny grafických ovládacích prvků je zobrazení textu nebo grafiky.
Pokud chceme zachytit vstup klávesnice pro ovládací prvky, které nemohou získat vstupní zaměření, musíme se zabývat rozhraním Windows API, háčky, zpětnými voláními a zprávy.
Háky Windows
Technicky je funkce „zavěšení“ funkcí zpětného volání, kterou lze vložit do zprávy systému Windows systému, aby aplikace mohla přistupovat k proudu zpráv před dalším zpracováním zprávy místo. U mnoha typů háčků systému Windows se zavolá háček klávesnice, kdykoli aplikace volá Funkce GetMessage () nebo PeekMessage () a existuje zpráva klávesnice WM_KEYUP nebo WM_KEYDOWN proces.
Abychom vytvořili háček na klávesnici, který zachytí veškerý vstup z klávesnice namířený na dané vlákno, musíme zavolat SetWindowsHookEx Funkce API. Rutiny, které přijímají události klávesnice, jsou aplikačně definované funkce zpětného volání nazývané hook funkce (KeyboardHookProc). Systém Windows volá funkci zavěšení pro každou zprávu stisknutí klávesy (klávesa nahoru a dolů) před umístěním zprávy do fronty zpráv aplikace. Funkce zavěšení může zpracovat, změnit nebo zrušit stisknutí kláves. Háčky mohou být místní nebo globální.
návratová hodnota SetWindowsHookEx je popisovač právě nainstalovaného háku. Před ukončením musí aplikace zavolat UnhookWindowsHookEx funkce k uvolnění systémových prostředků spojených s háčkem.
Příklad zavěšení klávesnice
Jako ukázku háčků na klávesnici vytvoříme projekt s grafickým ovládáním, který může přijímat stisknutí kláves. TImage je odvozen od TGraphicControl, lze jej použít jako kreslicí plochu pro naši hypotetickou bitevní hru. Protože TImage není schopen přijímat stisknutí klávesnice prostřednictvím standardních událostí na klávesnici, vytvoříme funkci zavěšení, která zachytí veškerý vstup z klávesnice namířený na náš kreslicí povrch.
TImage Zpracování událostí klávesnice
Začněte nový Projekt Delphi a umístit jednu komponentu obrázku do formuláře. Nastavte vlastnost Image1.Align na alClient. To je pro vizuální část, nyní musíme udělat nějaké kódování. Nejprve potřebujeme nějaké globální proměnné:
var
Form1: TForm1;
KBHook: HHook; {to zachycuje vstup z klávesnice}
cx, cy: celé číslo; {poloha bojové lodi}
{prohlášení o zpětném volání}
function KeyboardHookProc (Code: Integer; WordParam: Word; LongParam: LongInt): LongInt; stdcall;
implementace
...
Chcete-li nainstalovat háček, voláme SetWindowsHookEx v události OnCreate formuláře.
procedura TForm1.FormCreate (Sender: TObject);
začít
{Nastavte háček na klávesnici, abychom mohli zachytit vstup z klávesnice}
KBHook: = SetWindowsHookEx (WH_KEYBOARD,
{callback>} @ KeyboardHookProc,
HInstance,
GetCurrentThreadId ());
{umístěte bitevní loď doprostřed obrazovky}
cx: = Image1.ClientWidth div 2;
cy: = Image1.ClientHeight div 2;
Image1.Canvas. PenPos: = Bod (cx, cy);
konec;
Abychom uvolnili systémové prostředky spojené s háčkem, musíme zavolat funkci UnhookWindowsHookEx v události OnDestroy:
procedura TForm1.FormDestroy (Sender: TObject);
začít
{Zrušte zachycení klávesnice}
UnHookWindowsHookEx (KBHook);
konec;
Nejdůležitější částí tohoto projektu je Postup zpětného volání klávesniceHookProc používá ke zpracování úhozů.
function KeyboardHookProc (Code: Integer; WordParam: Word; LongParam: LongInt): LongInt;
začít
případ WordParam z
vk_Space: {vymazat cestu bitevní lodi}
začít
s Form1.Image1.Canvas
začít
Kartáč. Barva: = clWhite;
Kartáč. Styl: = bsSolid;
Fillrect (Form1.Image1.ClientRect);
konec;
konec;
vk_Right: cx: = cx + 1;
vk_Left: cx: = cx-1;
vk_Up: cy: = cy-1;
vk_Down: cy: = cy + 1;
konec; {pouzdro}
Pokud cx <2, pak cx: = Form1.Image1.ClientWidth-2;
Pokud cx> Form1.Image1.ClientWidth -2, pak cx: = 2;
Pokud cy <2, pak cy: = Form1.Image1.ClientHeight -2;
Pokud cy> Form1.Image1.ClientHeight-2, pak cy: = 2;
s Form1.Image1.Canvas
začít
Pero. Barva: = clRed;
Kartáč. Barva: = clYellow;
TextOut (0,0, Format ('% d,% d', [cx, cy]));
Obdélník (cx-2, cy-2, cx + 2, cy + 2);
konec;
Výsledek: = 0;
{Chcete-li zabránit systému Windows v předávání stisknutí kláves do cílového okna, musí být hodnota Výsledek nenulová hodnota.}
konec;
A je to. Nyní máme konečný kód pro zpracování klávesnice.
Všimněte si pouze jedné věci: tento kód není v žádném případě omezen na použití pouze s TImage.
Funkce KeyboardHookProc slouží jako obecný mechanismus KeyPreview & KeyProcess.