使用 GetKeyState 创建 3 键热键而不触发另一个类似的 2 键热键

Using GetKeyState to create 3 key hotkey without triggering another similar 2 key hotkey

问题

当一个3键热键(LShift+CapsLock+LButton)被按下时,一个类似的2键热键(CapsLock+LButton ) 被触发。

问题

  1. 为什么会这样?

  2. LShift+CapsLock+LButton热键如何触发正确的消息框(shift left click)?

代码

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

示例场景

我试过的

您可以测试 2 键热键内的 shift 以同时实现 CapsLock + LButtonCapsLock + Shift + LButton:

,而不是单独的 3 键热键
SetCapsLockState, AlwaysOff

CapsLock::
    MsgBox, "capslock"
return

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

避免类似热键的代码重复:

  • 使用 function

    CapsLock & RButton::CapsMouseHandler("right")
    CapsLock & LButton::CapsMouseHandler("left")
    
    CapsMouseHandler(btnString) {
        if (GetKeyState("LShift", "P")) {
            MsgBox % "shift " btnString " click"
        }
        else {
            MsgBox % btnString " click"
        }
    }
    
  • 使用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