Presretanje unosa tipkovnice pomoću Delphija

Razmislite na trenutak stvaranje neke brze arkadne igre. Sva se grafika prikazuje, recimo, u TPainBoxu. TPaintBox ne može primiti fokus ulaza - ne pokreću se događaji kada korisnik pritisne tipku; ne možemo presresti tipke za pomicanje kako bismo premjestili naš bojni brod. Delphi Pomozite!

Prekidač unosa tipkovnice

Većina Delphi aplikacija obično upravlja s korisničkim unosom putem specifičnih obrađivača događaja, onih koji nam omogućuju snimanje korisnika tipke i obradu pokret miša.

Znamo da je fokus fokus na primanje korisničkog unosa putem miša ili tipkovnice. Samo objekt koji ima fokus može primiti događaj na tipkovnici. Neke kontrole, poput TImage, TPaintBox, TPanel i TLabel ne mogu primiti fokus. Osnovna svrha većine grafičkih kontrola je prikazivanje teksta ili grafike.

Ako želimo presresti ulaz tipkovnice za kontrole koje ne mogu primiti fokus ulaza, morat ćemo se baviti Windows API-om, kukama, povratnim pozivima i poruke.

Kuke za Windows

Tehnički gledano, funkcija "kuka" je funkcija povratnog poziva koja se može umetnuti u Windows poruku sustav tako da aplikacija može pristupiti struji poruka prije nego što traje druga obrada poruke mjesto. Među mnogim vrstama kuka za Windows naziva se kuka na tipkovnici kad god aplikacija pozove GetMessage () ili PeekMessage () funkcija i tu je WM_KEYUP ili WM_KEYDOWN tipkovnica poruku za postupak.

instagram viewer

Da bismo stvorili kuku tipkovnice koja presreće sav unos tipkovnice usmjeren na određenu nit, moramo nazvati SetWindowsHookEx API funkcija. Programi koji primaju događaje na tipkovnici su funkcije za povratne pozive definirane aplikacijom, a koje se nazivaju udicama (KeyboardHookProc). Windows poziva vašu funkciju kuka za svaku poruku pritiska na tipku (tipku gore i tipku dolje) prije nego što se poruka postavi u red poruka aplikacije. Funkcija kuka može obraditi, promijeniti ili odbaciti pritiske tipki. Kuke mogu biti lokalne ili globalne.

povratna vrijednost SetWindowsHookEx je ručka s upravo instaliranom kukom. Prije prestanka prijave aplikacija mora nazvati UnhookWindowsHookEx funkcija za oslobađanje resursa sustava povezanih s udicom.

Primjer kuke na tipkovnici

Kao demonstracija kukica tipkovnice, napravit ćemo projekt s grafičkim upravljanjem koji može primati pritiske na tipke. TImage je izveden iz TGraphicControl-a, može se koristiti kao crtaća površina za našu hipotetsku borbenu igru. Budući da TImage ne može primati pritiske na tipkovnici kroz uobičajene događaje na tipkovnici, stvorit ćemo funkciju kuka koja presreće sve tipkovničke unose usmjerene na našu površinu crtanja.

TImage obrada događaja na tipkovnici

Započnite novo Delphi Project i stavite jednu komponentu slike na obrazac. Postavite Image1.Align svojstvo na alClient. To je to za vizualni dio, sada moramo napraviti malo kodiranja. Prvo, trebat će nam neke globalne varijable:

 var
Oblik1: TForm1;
KBHook: HHook; {ovaj presreće unos tipkovnice}
cx, cy: cijeli broj; {pratite položaj borbenog broda}
{povratna izjava}
funkcija KeyboardHookProc (Kod: Integer; WordParam: Riječ; LongParam: LongInt): LongInt; stdcall;
izvršenje
...

Da bismo instalirali kuku, u slučaju OnCreate obrasca zovemo SetWindowsHookEx.

 postupak TForm1.FormCreate (pošiljatelj: TObject);
početi
{Postavite kuku tipkovnice tako da možemo presresti unos tipkovnice}
KBHook: = Postavi WindowsWoookEx (WH_KEYBOARD,
{callback>} @KeyboardHookProc,
HInstance,
GetCurrentThreadId ());
{stavite bojni brod na sredinu zaslona}
cx: = Image1.ClientWidth div 2;
cy: = Image1.ClientHeight div 2;
Image1.Canvas. PenPos: = Točka (cx, cy);
kraj;

Da bismo oslobodili sistemske resurse povezane s udicom, moramo pozvati funkciju UnhookWindowsHookEx u događaju OnDestroy:

 postupak TForm1.FormDestroy (pošiljalac: TObject);
početi
{otkopčajte presretanje tipkovnice}
UnHookWindowsHookEx (KBHook);
kraj;

Najvažniji dio ovog projekta je Postupak povratnog poziva tipkovniceHookProc koristi se za obradu pritisaka tipki.

 funkcija KeyboardHookProc (Kod: Integer; WordParam: Riječ; LongParam: LongInt): LongInt;
početi
slučaj WordParam od
vk_Space: {izbrisati put bojnog broda}
početi
s Form1.Image1.Canvas do
početi
Četkanje. Boja: = clWhite;
Četkanje. Stil: = bsSolid;
Ispunite (Form1.Image1.ClientRect);
kraj;
kraj;
vk_Right: cx: = cx + 1;
vk_Left: cx: = cx-1;
vk_Up: cy: = cy-1;
vk_Down: cy: = cy + 1;
kraj; {slučaj}
Ako je cx <2, onda cx: = Form1.Image1.ClientWidth-2;
Ako je cx> Form1.Image1.ClientWidth -2, onda cx: = 2;
Ako je cy <2, onda je cy: = Form1.Image1.ClientHeight -2;
Ako je cy> Form1.Image1.ClientHeight-2, onda cy: = 2;
s Form1.Image1.Canvas do
početi
Pen. Boja: = clRed;
Četkanje. Boja: = clYellow;
TextOut (0,0, Format ('% d,% d', [cx, cy]));
Pravokutnik (cx-2, cy-2, cx + 2, cy + 2);
kraj;
Rezultat: = 0;
{Da biste spriječili da Windows prođe pritiske tipke u ciljni prozor, vrijednost rezultata mora biti jednaka nuli.}
kraj;

To je to. Sada imamo vrhunski kod za obradu tipkovnice.

Imajte na umu samo jedno: ovaj kôd ni na koji način nije ograničen samo na upotrebu s TImage-om.

Funkcija KeyboardHookProc služi kao općeniti mehanizam KeyPreview & KeyProcess.

instagram story viewer