Fontolja meg egy pillanatra egy gyors ügyességi játék létrehozását. Az összes grafika, mondjuk, egy TPainBox-ban jelenik meg. A TPaintBox nem képes fogadni a bemeneti fókuszt - a felhasználó nem nyom ki eseményeket, amikor a felhasználó megnyom egy gombot; nem tudjuk elhallgatni a kurzorbillentyűket a csatahajónk mozgatásához. Delphi Segítség!
A billentyűzet bemenetének elhallgatása
A legtöbb Delphi alkalmazás általában a felhasználói bemenetet kezeli bizonyos eseménykezelőkön keresztül, amelyek lehetővé teszik a felhasználó felfogását karakternél és a folyamat egér mozgása.
Tudjuk, hogy a fókusz az a képesség, hogy a felhasználó beérkezzen az egér vagy a billentyűzet segítségével. Csak a a fókuszban lévő objektum fogadhat billentyűzet eseményt. Egyes vezérlők, például a TImage, TPaintBox, TPanel és a TLabel nem képesek fókuszálni. A legtöbb grafikus vezérlés elsődleges célja a szöveg vagy a grafika megjelenítése.
Ha szeretnénk elfogni a billentyűzet bevitelét olyan vezérlők számára, amelyek nem tudják fogadni a bemeneti fókuszt, akkor a Windows API-val, a horgokkal, a visszahívásokkal és a
üzenetek.Windows Hook
Technikailag a "horog" funkció egy visszahívási funkció, amelyet beilleszthetünk a Windows üzenetbe rendszer, így egy alkalmazás hozzáférhet az üzenetfolyamhoz, mielőtt az üzenet más feldolgozása megtörténne hely. A Windows-horgok sok típusa között billentyűzet-horgot hívnak, amikor az alkalmazás felhívja a GetMessage () vagy PeekMessage () függvény, és van egy WM_KEYUP vagy WM_KEYDOWN billentyűzet üzenet a folyamat.
Ahhoz, hogy létrehozzunk egy billentyűzetet, amely elfogja az adott szálra irányított összes billentyűzet bemenetet, fel kell hívnunk SetWindowsHookEx API funkció. A billentyűzet eseményeit fogadó rutinok az alkalmazás által meghatározott visszahívási funkciók, úgynevezett horogfunkciók (KeyboardHookProc). A Windows meghívja a horogfunkciót minden egyes billentyű lenyomásával (felfelé és lefelé), mielőtt az üzenet az alkalmazás üzenet sorába kerül. A horog funkció képes feldolgozni, megváltoztatni vagy elvetni a billentyűleütéseket. A horgok lehetnek helyi vagy globálisak.
Az visszatérési érték A SetWindowsHookEx verziója az éppen telepített kampó fogantyúja. A befejezés előtt az alkalmazásnak fel kell hívnia a UnhookWindowsHookEx funkció a horoghoz kapcsolódó rendszer erőforrások felszabadításához.
Billentyűzet horog példa
A billentyűzethorgok bemutatójaként létrehozunk egy projektet grafikus vezérléssel, amely képes fogadni a billentyű lenyomásait. A TImage a TGraphicControl-ból származik, és rajzolási felületként is felhasználható a hipotetikus harci játékunkhoz. Mivel a TImage nem képes a billentyűzet megnyomására a normál billentyűzet eseményein keresztül, létrehozunk egy horgos funkciót, amely elfogja az összes billentyűzet bemenetet, amely a rajzfelületünkre irányul.
TImage feldolgozó billentyűzet események
Új indulás Delphi projekt és tegyen egy Image összetevőt egy űrlapra. Állítsa az Image1.Align tulajdonságot alClient értékre. Ennyi a vizuális rész, most meg kell csinálnunk néhány kódolást. Először is szükségünk lesz néhányra globális változók:
var
1. forma: TForm1;
KBHook: HHook; {ez elfogja a billentyűzet bemenetét}
cx, cy: egész szám; {a csatahajó helyzetének nyomon követése}
{visszahívási nyilatkozat}
funkció KeyboardHookProc (kód: egész szám; WordParam: Word; LongParam: LongInt): LongInt; stdcall;
végrehajtás
...
A horog telepítéséhez a SetWindowsHookEx-et hívjuk egy űrlap OnCreate eseményében.
eljárás TForm1.FormCreate (Feladó: TObject);
kezdődik
{Állítsa be a billentyűzet kampóját, hogy el tudjuk szakítani a billentyűzet bevitelét}
KBHook: = SetWindowsHookEx (WH_KEYBOARD,
{visszahívás>} @KeyboardHookProc,
HINSTANCE,
GetCurrentThreadId ());
{helyezze a csatahajót a képernyő közepére}
cx: = Image1.ClientWidth 2 div;
cy: = Image1.ClientHeight 2. div;
Image1.Canvas. PenPos: = pont (cx, cy);
végén;
A horoghoz kapcsolódó rendszer erőforrások felszabadításához meg kell hívnunk az UnhookWindowsHookEx függvényt az OnDestroy eseményen:
eljárás TForm1.FormDestroy (Feladó: TObject);
kezdődik
{nyitja meg a billentyűzet lehallgatását}
UnHookWindowsHookEx (KBHook);
végén;
A projekt legfontosabb része a KeyboardHookProc visszahívási eljárás gombnyomások feldolgozására használják.
funkció KeyboardHookProc (kód: egész szám; WordParam: Word; LongParam: LongInt): LongInt;
kezdődik
a WordParam eset
vk_Space: {törölje a csatahajó útját}
kezdődik
a Form1.Image1.Canvas segítségével
kezdődik
Kefe. Szín: = clWhite;
Kefe. Stílus: = bsSolid;
Kitölteni (Form1.Image1.ClientRect);
végén;
végén;
vk_jobb: cx: = cx + 1;
vk_Left: cx: = cx-1;
vk_Up: cy: = cy-1;
vk_Down: cy: = cy + 1;
végén; {ügy}
Ha cx <2, akkor cx: = Form1Image1.ClientWidth-2;
Ha cx> Form1.Image1.ClientWidth -2, akkor cx: = 2;
Ha cy <2, akkor cy: = Form1Image1.ClientHeight -2;
Ha cy> Form1.Image1.ClientHeight-2, akkor cy: = 2;
a Form1.Image1.Canvas segítségével
kezdődik
Toll. Szín: = CLRed;
Kefe. Szín: = clYellow;
TextOut (0,0, formátum ('% d,% d', [cx, cy]));
Téglalap (cx-2, cy-2, cx + 2, cy + 2);
végén;
Eredmény: = 0;
{Annak megakadályozása érdekében, hogy a Windows átadja a billentyűleütéseket a célablaknak, az Eredmény értékének nem nulla értéknek kell lennie.}
végén;
Ez az. Most van a végső billentyűzetfeldolgozó kód.
Csak egy dolgot vegye figyelembe: ez a kód semmilyen módon nem korlátozódik arra, hogy csak a TImage-vel lehessen használni.
A KeyboardHookProc funkció általános KeyPreview & KeyProcess mechanizmusként szolgál.