2014-08-27 44 views
5

Windows'ta düşük seviyeli klavye kancası kullanıyorum. Anahtarın başlangıçta basılıp basılmadığını ya da tekrar basıldığını hala anlayamadığım gerçeğine rağmen, bir charme gibi çalışıyor. documentation (+ here), 7 bitinin geçiş durumunu koruduğunu söylüyor. Ancak bu, sadece anahtar serbest bırakıldığında doğru gibi görünüyor. İlk önce tuşa bastığımda, Bit 7 ayarlanmadı.İlk tuşu belirlemek için KBDLLHOOKSTRUCT tuşlarını kullanın

Öncelikle tuşa basılıp basılmadığını anlamanın bir yolu var mı?

+0

Klavye kancalarıyla ilgili birçok sorundan biri, klavye durumu işlem başına bir özelliktir. Yani tamamen aldığınız şey, ön plan penceresine sahip olmak için hangi işlemin gerçekleştiğine ve * anahtarın daha önce anahtarı görüp görmediğine bağlıdır. –

+0

Biliyorum, ama bu durumda umrumda değil. Kullanıcının sadece sürecime odaklanmasını beklerim, fakat riskin farkındayım, teşekkürler! –

+3

@Hans Klavye durumu, iş parçacığı başına denetlenir (veya bir çok iş parçacığı, 'AttachThreadInput' çağrısının sonucu olarak birbirine bağlanmışsa, iş parçacığı grubu). * Iş parçacığı * işleminin tüm oluşumlarını * iş parçacığı veya iş parçacığı grubu * ile değiştirmek, yorumunuzu düzeltir. – IInspectable

cevap

1

Son zamanlarda bu problemle karşılaşıyorum. İyi bir çözüm bulamıyorum ama SetWindowHookEx'dan önce bir bayrak ve GetAsyncKeyState kullanıyorum.

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); 

Elbette, bu kod yalnızca bir anahtar için yapar. Birden çok tuş yapmak için bir dizi bayrak kullanabilirsiniz. Uygulamanıza bağlı olarak, kancanızın ayarlanmasından sonra ilk basışını isterseniz, kayıtsız şartsız olarak bayrağı false'a ayarlayabilirsiniz.

+0

Birisi daha iyi bir çözüm gönderene kadar şu anda yaptığım şey bu. Teşekkürler! –

İlgili konular