Uz brīdi apsveriet iespēju izveidot kādu ātru arkādes spēli. Teiksim, visa grafika tiek parādīta TPainBox. TPaintBox nespēj uztvert ievades fokusu - kad lietotājs nospiež taustiņu, notikumi netiek aktivizēti; mēs nevaram pārtvert kursora taustiņus, lai pārvietotu mūsu kaujas kuģi. Delfi palīdzēt!
Pārtvert tastatūras ievadi
Lielākā daļa Delphi lietojumprogrammu parasti apstrādā lietotāju ievadi, izmantojot īpašus notikumu apstrādātājus - tos, kas mums ļauj uztvert lietotāju taustiņsitieni un process peles kustība.
Mēs zinām, ka uzmanības centrā ir spēja saņemt lietotāja ievadi, izmantojot peli vai tastatūru. Tikai objekts, kam ir fokuss, var saņemt tastatūras notikumu. Dažas vadības ierīces, piemēram, TImage, TPaintBox, TPanel un TLabel, nevar saņemt fokusu. Lielākās daļas grafisko vadības ierīču galvenais mērķis ir parādīt tekstu vai grafiku.
Ja mēs vēlamies pārtvert tastatūras ievadi vadības ierīcēm, kuras nevar saņemt ievades fokusu, mums būs jārisina ar Windows API, āķiem, atzvaniem un ziņas.
Windows āķi
Tehniski “āķa” funkcija ir atzvanīšanas funkcija, ko var ievietot Windows ziņojumā sistēma, lai lietojumprogramma varētu piekļūt ziņojumu straumei, pirms notiek cita ziņojuma apstrāde vieta. Starp daudziem Windows āķu veidiem ikreiz, kad lietojumprogramma piezvana, tiek izsaukts tastatūras āķis Funkcija GetMessage () vai PeekMessage (), un tur ir WM_KEYUP vai WM_KEYDOWN tastatūras ziņojums uz process.
Lai izveidotu tastatūras āķi, kas pārtver visu tastatūras ievadi, kas vērsta uz doto pavedienu, mums ir jāzvana SetWindowsHookEx API funkcija. Rutīnas, kas saņem tastatūras notikumus, ir lietojumprogrammas noteiktas atzvanīšanas funkcijas, ko sauc par āķa funkcijām (KeyboardHookProc). Pirms ziņojuma ievietošanas lietojumprogrammas ziņojumu rindā Windows Windows izsauc jūsu āķa funkciju katram taustiņu ziņojumam (taustiņš augšup un taustiņš uz leju). Āķa funkcija var apstrādāt, mainīt vai atmest taustiņsitienus. Āķi var būt lokāli vai globāli.
atgriešanās vērtība no SetWindowsHookEx ir tikko uzstādītā āķa rokturis. Pirms darba pārtraukšanas lietojumprogrammai jāizsauc UnhookWindowsHookEx funkcija, lai atbrīvotu sistēmas resursus, kas saistīti ar āķi.
Tastatūras āķa piemērs
Kā tastatūras āķu demonstrāciju mēs izveidosim projektu ar grafisko vadību, kas var saņemt taustiņu nospiešanu. TImage ir iegūts no TGraphicControl, to var izmantot kā zīmēšanas virsmu mūsu hipotētiskajai kaujas spēlei. Tā kā TImage nevar saņemt tastatūras nospiedumus, izmantojot standarta tastatūras notikumus, mēs izveidosim āķa funkciju, kas pārtver visu tastatūras ievadi, kas vērsta uz mūsu zīmējuma virsmu.
TImage apstrādes tastatūras notikumi
Sāciet jaunu Delfu projekts un ievietojiet veidlapā vienu attēla komponentu. Iestatiet Image1.Align rekvizītu uz alClient. Tas ir vizuālajā daļā, tagad mums ir jāveic kaut kāda kodēšana. Pirmkārt, mums tas būs vajadzīgs globālie mainīgie:
var
1. forma: TForm1;
KBHook: HHook; {šī pārtver tastatūras ievadi}
cx, cy: vesels skaitlis; {izseko kaujas kuģa stāvokli}
{atzvanīšanas deklarācija}
funkcija KeyboardHookProc (kods: vesels skaitlis; WordParam: Word; LongParam: LongInt): LongInt; stdcall;
ieviešana
...
Lai instalētu āķi, veidlapas OnCreate notikumā mēs saucam SetWindowsHookEx.
procedūra TForm1.FormCreate (Sūtītājs: TObject);
sākt
{Iestatiet tastatūras āķi, lai mēs varētu pārtvert tastatūras ievadi}
KBHook: = SetWindowsHookEx (WH_KEYBOARD,
{atzvanīšana>} @KeyboardHookProc,
HNstance,
GetCurrentThreadId ());
{novietojiet kaujas kuģi ekrāna vidū}
cx: = Image1.ClientWidth div 2;
cy: = Image1.ClientHeight div 2;
Image1.Canvas. PenPos: = Punkts (cx, cy);
beigas;
Lai atbrīvotu sistēmas resursus, kas saistīti ar āķi, mums ir jāizsauc UnhookWindowsHookEx funkcija notikumā OnDestroy:
procedūra TForm1.FormDestroy (Sūtītājs: TObject);
sākt
{atvienojiet tastatūras pārtveršanu}
UnHookWindowsHookEx (KBHook);
beigas;
Vissvarīgākā šī projekta sastāvdaļa ir KeyboardHookProc atzvanīšanas procedūra izmanto taustiņsitienu apstrādei.
funkcija KeyboardHookProc (kods: vesels skaitlis; WordParam: Word; LongParam: LongInt): LongInt;
sākt
lieta WordParam no
vk_Space: {izdzēst kaujas kuģa ceļu}
sākt
ar Form1.Image1.Canvas darīt
sākt
Birste. Krāsa: = clWhite;
Birste. Stils: = bsSolid;
Aizpildiet pareizi (Form1.Image1.ClientRect);
beigas;
beigas;
vk_Right: cx: = cx + 1;
vk_Left: cx: = cx-1;
vk_Up: cy: = cy-1;
vk_Down: cy: = cy + 1;
beigas; {lieta}
Ja cx <2, tad cx: = Form1.Image1.ClientWidth-2;
Ja cx> Form1.Image1.ClientWidth -2, tad cx: = 2;
Ja cy <2, tad cy: = Form1.Image1.ClientHeight -2;
Ja cy> Form1.Image1.ClientHeight-2, tad cy: = 2;
ar Form1.Image1.Canvas darīt
sākt
Pildspalva. Krāsa: = saspiests;
Birste. Krāsa: = clYellow;
TextOut (0,0, formāts ('% d,% d', [cx, cy]));
Taisnstūris (cx-2, cy-2, cx + 2, cy + 2);
beigas;
Rezultāts: = 0;
{Lai neļautu Windows novirzīt taustiņsitienus mērķa logā, rezultāta vērtībai jābūt ar nulles vērtību.}
beigas;
Tieši tā. Mums tagad ir galīgais tastatūras apstrādes kods.
Ņemiet vērā tikai vienu lietu: šis kods nekādā veidā nav ierobežots, lai to lietotu tikai ar TImage.
KeyboardHookProc funkcija kalpo kā vispārējs KeyPreview & KeyProcess mehānisms.