2014-08-27 7 views
5

निर्धारित करने के लिए KBDLLHOOKSTRUCT का उपयोग करना मैं विंडोज़ पर निम्न-स्तरीय कीबोर्ड हुक का उपयोग कर रहा हूं। यह इस तथ्य के बावजूद एक आकर्षक की तरह काम करता है कि मैं वर्तमान में यह बताने में असमर्थ हूं कि कुंजी को शुरू में दबाया गया था या फिर दबाया गया था। documentation (+ here) कहता है, कि बिट 7 में संक्रमण स्थिति है। लेकिन जब यह कुंजी जारी की जा रही है तो यह सच साबित होता है। जब मैं पहली बार कुंजी दबाता हूं तो बिट 7 दुर्भाग्य से सेट नहीं होता है।पहली कुंजी प्रेस

क्या यह बताने का कोई तरीका है कि कुंजी शुरू में दबाया गया है या नहीं?

+0

कीबोर्ड हुक के साथ कई समस्याओं में से एक, कीबोर्ड स्थिति एक प्रति-प्रक्रिया संपत्ति है। तो आप पूरी तरह से क्या प्राप्त करते हैं इस पर निर्भर करता है कि अग्रभूमि विंडो के मालिक के पास कौन सी प्रक्रिया होती है और क्या * इससे पहले की कुंजी देखी गई है। –

+0

मुझे पता है, लेकिन मुझे इस मामले में परवाह नहीं है। मैं उम्मीद करता हूं कि उपयोगकर्ता केवल मेरी प्रक्रिया पर ध्यान केंद्रित करे, लेकिन मुझे जोखिम के बारे में पता है, धन्यवाद! –

+3

@ हंस कीबोर्ड स्थिति प्रति थ्रेड (या धागा समूह, यदि कई थ्रेड एक साथ जुड़े हुए हैं 'अटैच थ्रेड इनपुट' के परिणामस्वरूप एक साथ बंधे हैं)। * थ्रेड या थ्रेड ग्रुप * के साथ * प्रक्रिया * की सभी घटनाओं को बदलना * आपकी टिप्पणी को हल करता है। – IInspectable

उत्तर

1

मुझे हाल ही में इस समस्या में भाग लेने के लिए होता है। मुझे कोई अच्छा समाधान नहीं मिल रहा है, लेकिन मैं SetWindowHookEx से पहले ध्वज और GetAsyncKeyState का उपयोग कर समाप्त हुआ।

BOOL wasDown; 

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { 
    if (nCode == HC_ACTION) { 
     LPKBDLLHOOKSTRUCT key = (LPKBDLLHOOKSTRUCT) lParam; 
     if (key->vkCode == VK_SOMETHING) { 
      switch (wParam) { 
       case WM_KEYDOWN: 
       case WM_SYSKEYDOWN: 
        if (!wasDown) { 
         // Processing on first key down 
         wasDown = true; 
        } 
        break; 
       case WM_KEYUP: 
       case WM_SYSKEYUP: 
        // Processing on key up 
        wasDown = FALSE; 
        break; 
      } 
    } 
    return CallNextHookEx(NULL, nCode, wParam, lParam); 
} 

wasDown = GetAsyncKeyState(VK_SOMETHING) < 0; 
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0); 

बेशक, यह कोड केवल एक कुंजी के लिए करता है। आप एकाधिक कुंजी करने के लिए झंडे की एक सरणी का उपयोग कर सकते हैं। यदि आप अपने हुक सेट के बाद पहली प्रेस चाहते हैं तो आप अपने आवेदन के आधार पर बिना किसी शर्त के ध्वज को false पर सेट कर सकते हैं।

+0

यह वही है जो मैं वर्तमान में तब तक कर रहा हूं जब तक कि कोई बेहतर समाधान पोस्ट न करे। धन्यवाद! –

संबंधित मुद्दे