Za trenutek razmislite o ustvarjanju neke hitre arkadne igre. Vsa grafika je, recimo, prikazana v TPainBoxu. TPaintBox ne more prejeti vhodnega ostrenja - noben dogodek se ne sproži, ko uporabnik pritisne tipko; ne moremo prestreči kurzorskih tipk, da bi premaknili svojo bojno ladjo. Delphi pomoč!
Prestrezanje vnosa tipkovnice
Večina aplikacij Delphi običajno upravlja z uporabniškimi vnosi prek določenih upravljavcev dogodkov, ki nam omogočajo zajem uporabnika tipke in obdelati gibanje miške.
Vemo, da je poudarek možnost sprejemanja uporabniškega vnosa prek miške ali tipkovnice. Samo tisti predmet, ki ima fokus, lahko prejme dogodek na tipkovnici. Nekateri kontrolniki, kot so TImage, TPaintBox, TPanel in TLabel, ne morejo dobiti ostrine. Glavni namen večine grafičnih kontrol je prikaz besedila ali grafike.
Če želimo prestreči vhod s tipkovnice za kontrole, ki ne morejo prejeti vhodnega ostrenja, bomo morali obravnavati Windows API, kljuke, povratne klice in sporočila.
Kavlji za Windows
Tehnično gledano je funkcija "kavelj" funkcija povratnega klica, ki jo je mogoče vstaviti v sporočilo sistema Windows sistem, tako da lahko aplikacija dostopa do toka sporočil, preden se začne druga obdelava sporočila kraj. Med številnimi vrstami okenskih kljuk se pokliče kljuka na tipkovnici, kadar aplikacija pokliče Funkcija GetMessage () ali PeekMessage () in na voljo je sporočilo s tipkovnico WM_KEYUP ali WM_KEYDOWN postopek.
Če želite ustvariti kljuko na tipkovnici, ki prestreže ves vhod tipkovnice, usmerjen v dano nit, moramo poklicati SetWindowsHookEx Funkcija API. Programi, ki sprejemajo dogodke na tipkovnici, so funkcije za povratne klice, ki jih definira aplikacija, imenovane "kaveljske funkcije" (KeyboardHookProc). Windows pokliče vašo kljuko za vsako sporočilo o pritisku tipke (tipka gor in tipka), preden je sporočilo postavljeno v čakalno vrsto sporočil v aplikaciji. Funkcija kljuke lahko obdela, spremeni ali zavrže pritiske tipk. Kljuke so lahko lokalne ali globalne.
The povratna vrednost SetWindowsHookEx je ročaj za pravkar nameščen kavelj. Pred zaključkom mora aplikacija poklicati Odklenite WindowsHookEx funkcija za sprostitev sistemskih virov, povezanih s kavljem.
Primer kljuke na tipkovnici
Kot demonstracijo kljuk na tipkovnici bomo ustvarili projekt z grafičnim nadzorom, ki lahko sprejme pritiske tipk. TImage izhaja iz TGraphicControl, lahko ga uporabimo kot risalno površino za našo hipotetično borbeno igro. Ker TImage ne more sprejemati pritiskov na tipkovnico skozi običajne dogodke na tipkovnici, bomo ustvarili funkcijo kavljev, ki prestreže vse vhodne tipkovnice, usmerjene na našo površino risanja.
TImage obdelava dogodkov na tipkovnici
Začni novo Projekt Delphi in postavite eno komponento slike na obrazec. Nastavite Image1.Samostitev lastnosti na alClient. Tako je za vizualni del, zdaj moramo narediti nekaj kodiranja. Najprej jih bomo potrebovali globalne spremenljivke:
var
Obrazec1: TForm1;
KBHook: HHook; {ta prestreže vnos tipkovnice}
cx, cy: celo število; {položaj položaja bojne ladje}
{izjava o povratnem klicu}
funkcija KeyboardHookProc (koda: Integer; WordParam: Beseda; LongParam: LongInt): LongInt; stdcall;
izvajanje
...
Če želite namestiti kavelj, v primeru OnCreate obrazca pokličemo SetWindowsHookEx.
postopek TForm1.FormCreate (Pošiljatelj: TObject);
začeti
{Nastavite kljuko na tipkovnici, da bomo lahko prestregli vnos s tipkovnice}
KBHook: = SetWindowsHookEx (WH_KEYBOARD,
{callback>} @KeyboardHookProc,
HInstance,
GetCurrentThreadId ());
{postavite bojno ladjo na sredino zaslona}
cx: = Image1.ClientWidth div 2;
cy: = Image1.ClientHeight div 2;
Slika1.Canvas. PenPos: = Točka (cx, cy);
konec;
Če želite sprostiti sistemske vire, povezane s kavljem, moramo v dogodku OnDestroy poklicati funkcijo UnhookWindowsHookEx:
postopek TForm1.FormDestroy (Pošiljatelj: TObject);
začeti
{odklenite prestrezanje tipkovnice}
UnHookWindowsHookEx (KBHook);
konec;
Najpomembnejši del tega projekta je Postopek povratnega klica KeyboardHookProc se uporablja za obdelavo pritiskov tipk.
funkcija KeyboardHookProc (koda: Integer; WordParam: Beseda; LongParam: LongInt): LongInt;
začeti
primeru WordParam od
vk_Space: {izbrisati pot bojne ladje}
začeti
z Form1.Image1.Canvas do
začeti
Čopič. Barva: = clWhite;
Čopič. Slog: = bsSolid;
Izpolni (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; {Ovitek}
Če je cx <2, potem cx: = Form1.Image1.ClientWidth-2;
Če je cx> Form1.Image1.ClientWidth -2, potem cx: = 2;
Če je cy <2, potem cy: = Form1.Image1.ClientHeight -2;
Če je cy> Form1.Image1.ClientHeight-2, potem cy: = 2;
z Form1.Image1.Canvas do
začeti
Pero. Barva: = clRed;
Čopič. Barva: = clYellow;
TextOut (0,0, oblika ('% d,% d', [cx, cy]));
Pravokotnik (cx-2, cy-2, cx + 2, cy + 2);
konec;
Rezultat: = 0;
{Če želite preprečiti, da bi Windows s pritiskom tipke preusmeril v ciljno okno, mora biti vrednost rezultata enaka ničli vrednosti.}
konec;
To je to. Zdaj imamo vrhunsko kodo za obdelavo tipkovnice.
Upoštevajte samo eno stvar: ta koda nikakor ni omejena na uporabo samo s TImage.
Funkcija KeyboardHookProc služi kot splošni mehanizem KeyPreview & KeyProcess.