שקול לרגע ליצור משחק ארקייד מהיר. כל הגרפיקה מוצגת, נניח, ב- TPainBox. TPaintBox לא מצליחה לקבל את מיקוד הקלט - לא מופיעים אירועים כאשר המשתמש לוחץ על מקש; איננו יכולים ליירט מקשי סמן כדי להזיז את ספינת הקרב שלנו. דלפי עזרה!
יירט קלט מקלדת
לרוב יישומי דלפי מטפלים בדרך כלל בקלט משתמשים באמצעות מטפלי אירועים ספציפיים, כאלה המאפשרים לנו ללכוד את המשתמש הקשות ולעבד תנועת עכברים.
אנו יודעים שמיקוד הוא היכולת לקבל קלט משתמש באמצעות העכבר או המקלדת. רק ה אובייקט שיש בו המיקוד יכול לקבל אירוע מקלדת. חלק מהבקרות, כגון TImage, TPaintBox, TPanel ו- TLabel לא יכולות לקבל מיקוד. המטרה העיקרית של מרבית הפקדים הגרפיים היא הצגת טקסט או גרפיקה.
אם אנו רוצים ליירט קלט מקלדת עבור פקדים שאינם יכולים לקבל את מיקוד הקלט נצטרך להתמודד עם Windows API, ווים, התקשרות חוזרת ו- הודעות.
וויקס ווינדוס
מבחינה טכנית פונקציית "וו" היא פונקציית התקשרות חוזרת שניתן להכניס להודעת Windows מערכת כך שיישום יכול לגשת לזרם ההודעות לפני עיבוד אחר של ההודעה מקום. בין סוגים רבים של ווים לחלונות, נקרא וו מקלדת בכל פעם שהיישום קורא לו פונקצית GetMessage () או PeekMessage () ויש הודעת מקלדת WM_KEYUP או WM_KEYDOWN ל תהליך.
כדי ליצור וו מקלדת שמיירט את כל קלט המקלדת המופנה לחוט נתון, עלינו להתקשר SetWindowsHookEx פונקציית API. השגרה שמקבלת את אירועי המקלדת הן פונקציות התקשרות חוזרות המוגדרות על ידי יישומים הנקראות פונקציות hook (KeyboardHookProc). Windows מתקשר לפונקציית ה- hook שלך עבור כל הודעת הקשה (מקש למעלה ומקש למטה) לפני שההודעה מוצבת בתור ההודעות של היישום. פונקציית הוו יכולה לעבד, לשנות או למחוק הקשות. ווים יכולים להיות מקומיים או גלובליים.
ה ערך החזרה של SetWindowsHookEx הוא ידית לוו שרק הותקנה. לפני סיומה, על בקשה להתקשר אל UnhookWindowsHookEx פונקציה לשחרור משאבי מערכת הקשורים לוו.
דוגמת וו מקלדת
כהדגמה של ווים למקלדת, ניצור פרויקט עם שליטה גרפית שיכול לקבל לחיצות מקשים. TImage נגזר מ- TGraphicControl, זה יכול לשמש כמשטח ציור למשחק הקרב ההיפותטי שלנו. מכיוון ש- TImage לא מצליחה לקבל לחיצות מקשים דרך אירועי מקלדת סטנדרטיים, ניצור פונקציית וו שמיירטת את כל קלט המקלדת שמופנה למשטח השרטוט שלנו.
עיבוד TImage אירועי מקלדת
התחל חדש פרויקט דלפי והניח רכיב תמונה אחד על גבי טופס. הגדר את Image1.Align המאפיין ל- alClient. זהו זה עבור החלק הוויזואלי, עכשיו עלינו לבצע קידוד. ראשית, נצטרך כמה משתנים גלובליים:
var
טופס 1: TForm1;
KBHook: HHook; {זה מיירט את קלט המקלדת}
cx, cy: מספר שלם; {עקוב אחר עמדת ספינת הקרב}
{הצהרת התקשרות}
פונקציה KeyboardHookProc (קוד: מספר שלם; WordParam: Word; LongParam: LongInt): LongInt; stdcall;
יישום
...
כדי להתקין וו, אנו קוראים SetWindowsHookEx באירוע OnCreate של טופס.
נוהל TForm1.FormCreate (שולח: TObject);
התחל
{הגדר את וו המקלדת כך שנוכל ליירט את כניסת המקלדת}
KBHook: = SetWindowsHookEx (WH_KEYBOARD,
{callback>} @KeyboardHookProc,
אינסטנט,
GetCurrentThreadId ());
{מקם את ספינת הקרב באמצע המסך}
cx: = Image1.ClientWidth div 2;
cy: = Image1.ClientHeight div 2;
Image1.Canvas. PenPos: = נקודה (cx, cy);
סוף;
כדי לשחרר משאבי מערכת המשויכים לוו, עלינו להתקשר לפונקציה UnhookWindowsHookEx באירוע OnDestroy:
נוהל TForm1.FormDestroy (שולח: TObject);
התחל
{בטל את הווירטור של המקלדת}
UnHookWindowsHookEx (KBHook);
סוף;
החלק החשוב ביותר בפרויקט זה הוא נוהל התקשרות חזרה של KeyboardHookProc משמש לעיבוד הקשות.
פונקציה KeyboardHookProc (קוד: מספר שלם; WordParam: Word; LongParam: LongInt): LongInt;
התחל
מקרה WordParam של
vk_Space: {מחק את נתיב ספינת הקרב}
התחל
עם Form1.Image1.Canvas לעשות
התחל
מברשת. צבע: = clWhite;
מברשת. סגנון: = bsSolid;
Fillrect (Form1.Image1.ClientRect);
סוף;
סוף;
vk_Right: cx: = cx + 1;
vk_Left: cx: = cx-1;
vk_Up: cy: = cy-1;
vk_Down: cy: = cy + 1;
סוף; {מקרה}
אם cx <2 אז cx: = Form1.Image1.ClientWidth-2;
אם cx> Form1.Image1.ClientWidth -2 אז cx: = 2;
אם cy <2 אז cy: = Form1.Image1.ClientHeight -2;
אם cy> Form1.Image1.ClientHeight-2 אז cy: = 2;
עם Form1.Image1.Canvas לעשות
התחל
עט. צבע: = clRed;
מברשת. צבע: = צהוב
TextOut (0,0, פורמט ('% d,% d', [cx, cy]));
מלבן (cx-2, cy-2, cx + 2, cy + 2);
סוף;
תוצאה: = 0;
{כדי למנוע מ- Windows להעביר את הקשות לחלון היעד, ערך התוצאה חייב להיות ערך שאינו פעיל.}
סוף;
זהו זה. כעת יש לנו את קוד עיבוד המקלדת האולטימטיבי.
שימו לב רק לדבר אחד: קוד זה אינו מוגבל בשום דרך לשימוש רק עם TImage.
הפונקציה KeyboardHookProc משמשת כמנגנון כללי KeyPreview & KeyProcess.