एक आवेदन के बाहर की घटनाओं को पकड़ने के लिए माउस हुक

अपने डेल्फी एप्लिकेशन सक्रिय नहीं होने पर भी माउस गतिविधि को ट्रैक करना सीखें ट्रे या करता है कोई UI नहीं है बिल्कुल भी।

सिस्टम-वाइड (या वैश्विक) माउस हुक को स्थापित करके आप यह देख सकते हैं कि उपयोगकर्ता क्या कर रहा है चूहा और तदनुसार कार्य करें।

एक हुक क्या है और यह कैसे काम करता है?

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

एक वैश्विक हुक बनाने के लिए आपको 2 परियोजनाएं चाहिए, निष्पादन योग्य फ़ाइल बनाने के लिए 1 और हुक प्रक्रिया से युक्त DLL बनाने के लिए 1।

हमारे लेख पर डेल्फी से कीबोर्ड हुक के साथ काम करना यह बताता है कि नियंत्रण के लिए कीबोर्ड इनपुट को कैसे इंटरसेप्ट किया जा सकता है जो इनपुट फ़ोकस प्राप्त नहीं कर सकता (जैसे TImage)।

माउस को हुक करना

instagram viewer

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

यहां सिस्टम-वाइड माउस हुक के लिए एक विचार है: यदि उदाहरण के लिए, आप माउस को स्क्रीन के दाईं ओर ले जाना चाहते हैं जब यह बाएं किनारे की ओर बढ़ता है (और "इसे" छूता है), तो आप माउस को बदलने के लिए एक वैश्विक माउस हुक लिख सकते हैं सूचक।

आप एक गतिशील लिंक लाइब्रेरी प्रोजेक्ट बनाकर शुरू करते हैं। डीएलएल को दो तरीकों का निर्यात करना चाहिए: "हुकमाउस" और "अनहुकमाउस"।

हुकमाउस प्रक्रिया कॉल करती है SetWindowsHookEx एपीआई पहले पैरामीटर के लिए "WH_MOUSE" पास कर रहा है - इस प्रकार एक हुक प्रक्रिया स्थापित कर रहा है जो माउस संदेशों की निगरानी करता है। SetWindowsHookEx के मापदंडों में से एक है आपका कॉलबैक फ़ंक्शन विंडोज तब कॉल करेगा जब एक माउस संदेश संसाधित होना है:

SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);

SetWindowsHookEx में अंतिम पैरामीटर (मान = 0) परिभाषित करता है कि हम एक वैश्विक हुक पंजीकृत कर रहे हैं।

हुकप्रोक माउस से संबंधित संदेशों को पार्स करता है और हमारी परीक्षा परियोजना को एक कस्टम संदेश ("माउसहूकमैसेज") भेजता है:

समारोह हुकप्रोक (nCode: Integer; MsgID: WParam; डेटा: एलपीरम): LResult; stdcall;

वर

 माउसप्वाइंट: TPoint;

 नोटिफ़ॉर्मफॉर्म: बूलियन;

 माउसडायरेक्शन: TMouseDirection;

शुरू

 mousePoint: = PMouseHookStruct (डेटा) ^। पीटी;


 InformTestForm: = false;


अगर (MousePoint। X = 0) फिर

शुरू

 खिड़कियाँ। SetCursorPos (-2 + स्क्रीन)। चौड़ाई, mousePoint.y);

 सूचनापत्र: सत्य;

 माउसडायरेक्शन: = mdRight;

समाप्त;

...
अगर notifyTestForm फिर

शुरू

 पोस्टमेज़ेज (फाइंडविंडो ('TMainHookTestForm', nil), माउसहूकमैसेज, एमएसजीआईडी, इंटेगर (माउसडायरेक्शन));

समाप्त;

परिणाम: = CallNextHookEx (हुक, nCode, MsgID, डेटा);
समाप्त;

टिप: PM32HookStruct रिकॉर्ड और HookProc फ़ंक्शन के हस्ताक्षर के बारे में जानने के लिए Win32 SDK फाइलों को पढ़ें।

ध्यान दें: एक हुक फ़ंक्शन को कहीं भी कुछ भी भेजने की आवश्यकता नहीं है - पोस्टमैसेज कॉल का उपयोग केवल यह इंगित करने के लिए किया जाता है कि DLL "बाहरी" दुनिया के साथ संवाद कर सकता है।

माउस हुक "श्रोता"

"MouseHookMessage" संदेश आपके परीक्षण प्रोजेक्ट पर पोस्ट किया गया है - "TMainHookTestForm" नाम का एक फ़ॉर्म। आप संदेश प्राप्त करने और आवश्यकतानुसार कार्य करने के लिए WndProc विधि को ओवरराइड करेंगे:

प्रक्रिया TMainHookTestForm। WndProc (वर संदेश: TMessage);

शुरू

विरासत में मिला WndProc (संदेश);

अगर संदेश। Msg = हुककमोन। MouseHookMessage फिर

शुरू

// कार्यान्वयन कोड के साथ पाया गया

 सिग्नल (TMouseDirection (संदेश) एलपीरम));

समाप्त;

समाप्त;

बेशक, जब फॉर्म बनता है (OnCreate) तो आप DLL से हुकमाउस प्रक्रिया को कॉल करते हैं, जब यह बंद हो जाता है (OnDestroy) जिसे आप UnHookMouse प्रक्रिया कहते हैं।

नोट: हुक सिस्टम को धीमा करते हैं क्योंकि वे प्रत्येक संदेश के लिए सिस्टम को संसाधित करने की मात्रा बढ़ाते हैं। आपको केवल हुक स्थापित करना चाहिए जब आवश्यक हो, और इसे जितनी जल्दी हो सके हटा दें।