Utilisation de GetKeyState pour créer un raccourci clavier à 3 touches sans déclencher un autre raccourci clavier similaire à 2 touches
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
Pourquoi cela arrive-t-il?
Comment la boîte de message correcte (
shift left click
) peut-elle être déclenchée pour le raccourci clavierLShift
+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
CapsLock
et la boîte de message correcte (capslock
) apparaît - Appuyez sur
CapsLock
+LButton
et la boîte de message correcte (left click
) apparaît - Appuyez sur
LShift
+CapsLock
+LButton
et 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
+LButton
et 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
#If
documentation 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 raccourciCapsLock
+LButton
- En utilisant régulièrement imbriquées
if
,else if
, et deselse
déclarations au lieu de la#If
directive 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 raccourciCapsLock
+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 click
boîte de message correcte ( ) mais déclenche parfois la touche de raccourci CapsLock donnant la boîte de message incorrect (capslock
)
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 + LButton
et 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