मैं वैश्विक माउस और कीबोर्ड इनपुट को कैप्चर करने की कोशिश कर रहा हूं।निम्न-स्तर के माउस और कीबोर्ड हुक को समझना (win32)
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode >= 0) {
if (wParam == WM_RBUTTONDOWN) printf("right mouse down\n");
if (wParam == WM_RBUTTONUP) printf("right mouse up\n");
}
return CallNextHookEx(0, nCode, wParam, lParam);
}
HHOOK mousehook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, NULL, 0);
while(true) {
MSG msg;
if (PeekMessage(&msg,0,0,0,PM_REMOVE)) {
printf("msg recvd\n");
TranslateMessage(&msg);
DispatchMessage(&msg);
}
#ifdef TEST
Sleep(50);
#endif
}
तो यहाँ सब कुछ काम करता है, अगर मैं #define TEST
Sleep
में डालने के लिए छोड़कर, माउस अविश्वसनीय रूप से सुस्त हो जाता है, के रूप में अगर मैं अचानक ही माउस 20 बार एक दूसरे को अद्यतन करने के लिए अनुमति देते हैं उम्मीद की जा सकती। और नींद के बिना, मैं 100% पर सीपीयू pegging हूँ। लेकिन यह अभी ठीक है (अगर मैं GetMessage
का उपयोग करता हूं तो यह दूर हो जाता है)।
अब जब मैं इसे समझता हूं, निम्न-स्तरीय हुक उस प्रक्रिया में स्विच-स्विचिंग द्वारा काम करते हैं, और फिर प्रक्रिया को भेजकर इसे हुक कॉलबैक निष्पादित करने के लिए कुछ प्रकार का संदेश भेजते हैं। मुझे थोड़ा उलझन में आता है, हालांकि, मेरा प्रोग्राम कभी भी "msg recvd" प्रिंट नहीं करेगा, लेकिन जब भी मैं दायां माउस बटन क्लिक करता हूं तो यह "दायां माउस डाउन/अप" प्रिंट करता है। इससे मुझे यह निष्कर्ष निकाला जाता है कि MouseHookProc
को PeekMessage
कॉल के दौरान बुलाया जा रहा है। यह किसी प्रकार का विशेष संदेश होता है और PeekMessage
0 देता है। लेकिन मुझे अभी भी PeekMessage
या कुछ समकक्ष कॉल करने की आवश्यकता है।
चूंकि मेरे प्रोग्राम को चीजों का एक गुच्छा करने की ज़रूरत है, इसलिए मैं स्पष्ट रूप से मेरे संदेश पंपिंग लूप का वजन नहीं कर सकता (वह जो PeekMessage
कहता है) जो दूसरे कार्य को कॉल करके कहता है, वापस लौटने के लिए कहें। थोड़ी भारी उठाने के साथ-साथ माउस प्रतिक्रिया को बनाए रखने के लिए मैं अपने कार्यक्रम को कैसे बढ़ा सकता हूं? एक बहुप्रचारित Win32 प्रोग्राम में, अभी भी एक संदेश कतार है, है ना?
अद्यतन: एमएस के दस्तावेज़ीकरण पर पढ़ने के बाद मुझे लगता है कि मुझे पता है कि मेरे लिए क्या करना सही है। मुझे बस अपने आवेदन में एक धागा पैदा करना चाहिए जो माउस हुक को पंजीकृत करने के लिए SetWindowsHookEx
पर कॉल करता है, और उसके बाद अपने संदेश लूप में बैठता है, और सिस्टम इस धागे में माउस अपडेट भेजने का ख्याल रखेगा। यह MouseHookProc
के भीतर जो चाहें वह करने के लिए स्वतंत्र होगा, और मेरा शेष आवेदन स्वतंत्र रूप से चलाया जाएगा।
क्या आपके पास एक डीएलएल के अंदर 'माउसहूकप्रोक' है और एक EXE के अंदर 'SetWindowsHookEx' और' PeekMessage' लूप 'है? – Oleg
मैं एक डीएलएल इंजेक्ट करने से बचना चाहता था। सिस्टम के लिए अपने 'माउसहूकप्रोक' को कॉल करने के लिए सिस्टम पर स्विच करने के लिए मेरी ज़रूरतों के लिए यह अधिक उपयुक्त लगता है, इसलिए मैं निम्न स्तर के माउस हुक का उपयोग क्यों करना चाहता हूं। जैसा कि मैं इसे समझता हूं, एक नियमित माउस हुक, अगर मैं इसे वैश्विक होना चाहता हूं, तो डीएलएल विधि का उपयोग करना चाहिए। –