2010-01-30 18 views
5

मैं एक कंसोल एप्लिकेशन बना रहा हूं जिसमें मैं प्रमुख प्रेस (जैसे यूपी तीर) रिकॉर्ड करना चाहता हूं। मैंने लो लेवल कीबोर्ड हुक बनाया है जो किसी भी थ्रेड में सभी कुंजी प्रेस को कैप्चर करना और मेरे कॉलबैक फ़ंक्शन को आवेदना देना है, लेकिन यह काम नहीं कर रहा है। जब मैं एक कुंजी दबाता हूं, तो प्रोग्राम थोड़ी देर के लिए स्टाल करता है, लेकिन कॉलबैक को कभी भी आमंत्रित नहीं करता है। मैंने प्रलेखन की जांच की है लेकिन कुछ भी नहीं मिला है। मुझे नहीं पता कि मैं SetWindowsHookEx() गलत तरीके से उपयोग कर रहा हूं (मेरे ज्ञान के लिए यह सफलतापूर्वक हुक बनाता है) या मेरा कॉलबैक फ़ंक्शन गलत है! मुझे यकीन नहीं है कि क्या गलत है! मदद के लिए अग्रिम धन्यवाद।सी ++ SetWindowsHookEx WH_KEYBOARD_LL सही सेटअप

#include "Windows.h" 
#include <iostream> 
using namespace std; 

HHOOK hookHandle; 

LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam); 

int _tmain(int argc, _TCHAR* argv[]) { 

hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, keyHandler, NULL, 0); 

if(hookHandle == NULL) { 
    cout << "ERROR CREATING HOOK: "; 
    cout << GetLastError() << endl; 
    getchar(); 
    return 0; 
} 

MSG message; 

while(GetMessage(&message, NULL, 0, 0) != 0) { 
    TranslateMessage(&message); 
    DispatchMessage(&message); 
} 

cout << "Press any key to quit..."; 
getchar(); 

UnhookWindowsHookEx(hookHandle); 

return 0; 
} 


LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam) { 
cout << "Hello!" << endl; 

// Checks whether params contain action about keystroke 
if(nCode == HC_ACTION) { 
    cout << ((KBDLLHOOKSTRUCT *) lParam)->vkCode << endl; 
} 

return CallNextHookEx(hookHandle, nCode, 
      wParam, lParam); 
} 
+0

कृपया देखें [यहां] (http://stackoverflow.com/questions/2127112/global-keyboard-hook-not-working/2127292 # 21272 9 2) एक समान प्रश्न के लिए, जिसका मैंने उत्तर दिया है कि आपकी मदद करेगा। – t0mm13b

उत्तर

2

आप एक syscall (getchar) पर अवरोधित नहीं कर सकते, तो आप एक खिड़की पाश चल रहा है और प्रसंस्करण संदेश आपके हुक कहा जाता हो जाता है से पहले किया जाना है।

+0

मैं विंडो लूप को कैसे कार्यान्वित करूं? मैं WinAPIs से वास्तव में अपरिचित हूं (वास्तव में विंडो लूप का उद्देश्य क्या है?) – Mahir

+0

http://msdn.microsoft.com/en-us/library/aa383682(VS.85).aspx एक अच्छा उदाहरण है –

+0

धन्यवाद , अगर मुझे अभी भी समस्याएं आ रही हैं तो मैं कुछ मिनटों में वापस पोस्ट करूंगा। – Mahir

0

विंडोज एक्सपी पर, आपको hInstance (WinMain से) SetWindowsHookEx पर तीसरे तर्क के रूप में पास करने की आवश्यकता है। उदाहरण के लिए:

int WINAPI WinMain 
(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPTSTR lpCmdLine, int nCmdShow) { 

    hookHandle = SetWindowsHookEx (WH_KEYBOARD_LL, keyHandler, hInstance, 0); 

// ... 
0

मैं पहले सिमुलेशन का सुझाव देता हूं;

// वीबी: अनुप्रयोगों को पुनर्प्राप्त करें HINSTANCE appInstance = GetModuleHandle (NULL);

और फिर: हुकहैंडल = सेटविंडोशूकएक्स (WH_KEYBOARD_LL, keyHandler, appInstance, 0);

// ..., लेकिन वहाँ एक और त्रुटियों बाद में भी हैं