Utilisation de GetKeyState pour créer un raccourci clavier à 3 touches sans déclencher un autre raccourci clavier similaire à 2 touches


surajs02

Problème

Lorsqu'une touche de raccourci à 3 touches ( LShift+ CapsLock+ LButton) est enfoncée, une touche de raccourci similaire à 2 touches ( CapsLock+ LButton) est déclenchée à la place.

Des questions

  1. Pourquoi cela arrive-t-il?

  2. Comment la boîte de message correcte ( shift left click) peut-elle être déclenchée pour le raccourci clavier LShift+ CapsLock+ LButton?

Code

SetCapsLockState, AlwaysOff
CapsLock::
    MsgBox, "capslock"
return
CapsLock & LButton::
    MsgBox, "left click"
return

; 3 key hotkey
; problem here is when LShift+CapsLock+LButton are pressed, the CapsLock+LButton is 
; triggered instead
#If GetKeyState("LShift", "P") && GetKeyState("CapsLock", "P")
    LButton::
        MsgBox, "shift left click"
    return
#If

Exemple de scénario

  • Appuyez sur CapsLocket la boîte de message correcte ( capslock) apparaît
  • Appuyez sur CapsLock+ LButtonet la boîte de message correcte ( left click) apparaît
  • Appuyez sur LShift+ CapsLock+ LButtonet une boîte de message incorrecte ( left click) apparaît (la boîte de message ( shift left click) aurait dû apparaître)
  • Appuyez sur CapsLock+ LShift+ LButtonet une boîte de message incorrecte ( left click) apparaît (la boîte de message ( shift left click) aurait dû apparaître)

Ce que j'ai essayé

  • En vérifiant la #Ifdocumentation de la directive, il mentionne un délai d'expiration qui pourrait affecter la combinaison de boutons, cependant, appuyer sur les boutons à des vitesses variables provoque toujours le déclenchement de la touche de raccourci CapsLock+LButton
  • En utilisant régulièrement imbriquées if, else if, et des elsedéclarations au lieu de la #Ifdirective pour modifier l'ordre du 3 hotkey clé
  • Utilisation du $modificateur pour empêcher la touche de raccourci à 3 touches de déclencher la touche de raccourci CapsLock+LButton
  • Diviser le raccourci clavier à 3 touches en plusieurs parties, par exemple, mettre un raccourci clavier à 2 touches dans un #If GetKeyState, c'est-à-dire:

    #If GetKeyState("LShift", "P")
        CapsLock & LButton::
            MsgBox, "shift left click"
        return
    #If
    

    Cela donne généralement la shift left clickboîte de message correcte ( ) mais déclenche parfois la touche de raccourci CapsLock donnant la boîte de message incorrect ( capslock)

Josh Brobst

Au lieu d'avoir un raccourci clavier à 3 touches séparé, vous pouvez tester le décalage à l'intérieur du raccourci clavier à 2 touches pour implémenter à la fois CapsLock + LButtonet CapsLock + Shift + LButton:

SetCapsLockState, AlwaysOff

CapsLock::
    MsgBox, "capslock"
return

CapsLock & LButton::
    if (GetKeyState("LShift", "P")) {
        MsgBox, "shift left click"
    }
    else {
        MsgBox, "left click"
    }
return

Éviter la duplication de code pour des raccourcis clavier similaires:

  • Utiliser une fonction

    CapsLock & RButton::CapsMouseHandler("right")
    CapsLock & LButton::CapsMouseHandler("left")
    
    CapsMouseHandler(btnString) {
        if (GetKeyState("LShift", "P")) {
            MsgBox % "shift " btnString " click"
        }
        else {
            MsgBox % btnString " click"
        }
    }
    
  • Utilisation de A_ThisHotkey

    CapsLock & RButton::
    CapsLock & LButton::
        btnString := InStr(A_ThisHotkey, "LButton") ? "left" : "right"
        if (GetKeyState("LShift", "P")) {
            MsgBox % "shift " btnString " click"
        }
        else {
            MsgBox % btnString " click"
        }
    return
    

Articles connexes