डेल्फी के साथ कीबोर्ड इनपुट को इंटरसेप्ट करना

कुछ तेज आर्केड गेम के एक पल के निर्माण पर विचार करें। सभी ग्राफिक्स प्रदर्शित किए गए हैं, मान लीजिए कि एक TPainBox में। TPaintBox इनपुट फ़ोकस प्राप्त करने में असमर्थ है - जब उपयोगकर्ता किसी कुंजी को दबाता है तो कोई घटना नहीं होती है; हम अपने युद्धपोत को स्थानांतरित करने के लिए कर्सर कुंजियों को रोक नहीं सकते। डेल्फी मदद!

अवरोधक कीबोर्ड इनपुट

अधिकांश डेल्फी एप्लिकेशन आमतौर पर विशिष्ट ईवेंट हैंडलर के माध्यम से उपयोगकर्ता इनपुट को संभालते हैं, जो हमें उपयोगकर्ता को पकड़ने में सक्षम बनाते हैं कीस्ट्रोक्स और प्रक्रिया माउस आंदोलन.

हम जानते हैं कि ध्यान माउस या कीबोर्ड के माध्यम से उपयोगकर्ता इनपुट प्राप्त करने की क्षमता है। सिर्फ ऑब्जेक्ट जिसमें फ़ोकस है, एक कीबोर्ड ईवेंट प्राप्त कर सकता है. कुछ नियंत्रण, जैसे TImage, TPaintBox, TPanel, और TLabel फोकस प्राप्त नहीं कर सकते हैं। अधिकांश ग्राफिक नियंत्रणों का प्राथमिक उद्देश्य पाठ या ग्राफिक्स प्रदर्शित करना है।

यदि हम नियंत्रण के लिए कीबोर्ड इनपुट को इंटरसेप्ट करना चाहते हैं जो इनपुट फ़ोकस प्राप्त नहीं कर सकता है तो हमें विंडोज एपीआई, हुक, कॉलबैक और से निपटना होगा। संदेशों.

instagram viewer

विंडोज हुक

तकनीकी रूप से, "हुक" फ़ंक्शन एक कॉलबैक फ़ंक्शन है जिसे विंडोज संदेश में डाला जा सकता है सिस्टम इसलिए एप्लिकेशन मैसेज की अन्य प्रोसेसिंग से पहले मैसेज स्ट्रीम एक्सेस कर सकता है स्थान। कई प्रकार की खिड़कियों के हुक के बीच, जब भी एप्लिकेशन कॉल करता है, एक कीबोर्ड हुक कहा जाता है GetMessage () या PeekMessage () फ़ंक्शन और इसमें WM_KEYUP या WM_KEYDOWN कीबोर्ड संदेश है प्रक्रिया।

एक कीबोर्ड हुक बनाने के लिए जो किसी दिए गए धागे को निर्देशित सभी कीबोर्ड इनपुट को स्वीकार करता है, हमें कॉल करने की आवश्यकता है SetWindowsHookEx एपीआई समारोह। कीबोर्ड ईवेंट प्राप्त करने वाली दिनचर्याएँ अनुप्रयोग-परिभाषित कॉलबैक फ़ंक्शन हैं, जिन्हें हुक फ़ंक्शंस (KeyboardHookProc) कहा जाता है। संदेश के अनुप्रयोग कतार में रखे जाने से पहले विंडोज प्रत्येक कीस्ट्रोक संदेश (कुंजी अप और कुंजी डाउन) के लिए अपने हुक फ़ंक्शन को कॉल करता है। हुक फ़ंक्शन कीस्ट्रोक्स को संसाधित कर सकता है, बदल सकता है या त्याग सकता है। हुक स्थानीय या वैश्विक हो सकते हैं।

प्रतिलाभ की मात्रा SetWindowsHookEx केवल स्थापित हुक के लिए एक हैंडल है। समाप्त करने से पहले, एक एप्लिकेशन को कॉल करना होगा UnhookWindowsHookEx हुक से जुड़े सिस्टम संसाधनों को मुफ्त में कार्य करना।

कीबोर्ड हुक उदाहरण

कीबोर्ड हुक के प्रदर्शन के रूप में, हम ग्राफ़िकल नियंत्रण के साथ एक प्रोजेक्ट बनाएंगे जो प्रमुख प्रेस प्राप्त कर सकता है। TImage TGraphicControl से लिया गया है, इसे हमारे काल्पनिक युद्ध खेल के लिए एक ड्राइंग सतह के रूप में इस्तेमाल किया जा सकता है। चूंकि TImage मानक कीबोर्ड घटनाओं के माध्यम से कीबोर्ड प्रेस प्राप्त करने में असमर्थ है, इसलिए हम एक हुक फ़ंक्शन बनाएंगे जो हमारी ड्राइंग सतह पर निर्देशित सभी कीबोर्ड इनपुट को इंटरसेप्ट करता है।

TImage प्रोसेसिंग कीबोर्ड इवेंट्स

नई शुरुआत डेल्फी प्रोजेक्ट और एक छवि घटक को एक फ़ॉर्म पर रखें। सेट करें Image1.lign गुण को AlClient के लिए। यह दृश्य भाग के लिए है, अब हमें कुछ कोडिंग करनी होगी। सबसे पहले, हमें कुछ की आवश्यकता होगी सार्वत्रिक चर:

 वर
फॉर्म 1: TForm1;
KBHook: HHook; {यह कीबोर्ड इनपुट स्वीकार करता है}
cx, साइबर: पूर्णांक; {ट्रैक बैटल शिप की स्थिति}
{कॉलबैक की घोषणा}
समारोह KeyboardHookProc (कोड: पूर्णांक; WordParam: शब्द; लोंगपराम: लोंगआईंट): लोंगआईंट; stdcall;
कार्यान्वयन
...

हुक को स्थापित करने के लिए, हम प्रपत्र के OnCreate ईवेंट में SetWindowsHookEx कहते हैं।

 प्रक्रिया TForm1.FormCreate (प्रेषक: Tobject);
शुरू
{कीबोर्ड हुक सेट करें ताकि हम कीबोर्ड इनपुट को इंटरसेप्ट कर सकें}
KBHook: = SetWindowsHookEx (WH_KEYBOARD,
{कॉलबैक>} @KeyboardHookProc,
HInstance,
GetCurrentThreadId ());
{युद्ध जहाज को स्क्रीन के बीच में रखें}
cx: = Image1.ClientWidth div 2;
cy: = Image1.ClientHeight div 2;
Image1.Canvas। पेनपोस: = प्वाइंट (सीएक्स, साइबर);
समाप्त;

हुक से जुड़े सिस्टम संसाधनों को मुक्त करने के लिए, हमें OnDestroy अभियान में UnhookWindowsHookEx फ़ंक्शन को कॉल करना होगा:

 प्रक्रिया TForm1.FormDestroy (प्रेषक: TObject);
शुरू
{कीबोर्ड इंटरसेप्ट को अनहुक करें}
UnHookWindowsHookEx (KBHook);
समाप्त;

इस परियोजना का सबसे महत्वपूर्ण हिस्सा है KeyboardHookProc कॉलबैक प्रक्रिया कीस्ट्रोक्स को संसाधित करने के लिए उपयोग किया जाता है।

 समारोह KeyboardHookProc (कोड: पूर्णांक; WordParam: शब्द; लोंगपराम: लोंगआईंट): लोंगआईंट;
शुरू
मामला WordParam का
vk_Space: {लड़ाई जहाज का रास्ता मिटाएँ}
शुरू
Form1.Image1.Canvas के साथ
शुरू
ब्रश। रंग: = क्लेव्हीट;
ब्रश। शैली: = bsSolid;
सही (Form1.Image1.ClientRect);
समाप्त;
समाप्त;
vk_Right: cx: = cx + 1;
vk_Left: cx: = cx-1;
vk_Up: साइबर: = साइबर -1;
vk_Down: cy: = cy + 1;
समाप्त; {मामला}
यदि cx <2 तब cx: = Form1.Image1.ClientWidth-2;
अगर cx> Form1.Image1.ClientWidth -2 फिर cx: = 2;
यदि साइबर <2 तो साइबर: = Form1.Image1.ClientHeight -2;
अगर cy> Form1.Image1.ClientHeight-2 तो cy: = 2;
Form1.Image1.Canvas के साथ
शुरू
कलम। रंग: = लिपटा;
ब्रश। रंग: = क्लाईलो;
TextOut (0,0, स्वरूप ('% d,% d', [cx, cy]));
आयत (cx-2, cy-2, cx + 2, cy + 2);
समाप्त;
परिणाम: = 0;
{विंडोज को कीस्ट्रोक्स से टारगेट विंडो में जाने से रोकने के लिए, रिजल्ट वैल्यू एक नॉनजेरो वैल्यू होनी चाहिए।}
समाप्त;

बस। अब हमारे पास अंतिम कीबोर्ड प्रोसेसिंग कोड है।

केवल एक बात नोट करें: यह कोड किसी भी तरह से केवल TImage के साथ उपयोग करने के लिए प्रतिबंधित नहीं है।

KeyboardHookProc फ़ंक्शन एक सामान्य KeyPreview और KeyProcess तंत्र के रूप में कार्य करता है।

instagram story viewer