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

时间:2018-03-31 17:35:11

标签: autohotkey

问题

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

问题

  1. 为什么会这样?

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

  3. 代码

    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
    

    示例方案

    • CapsLock,然后出现正确的消息框(capslock
    • CapsLock + LButton,然后出现正确的消息框(left click
    • LShift + CapsLock + LButton,系统会显示错误消息框(left click)(应显示消息框(shift left click))
    • CapsLock + LShift + LButton,系统会显示错误消息框(left click)(应显示消息框(shift left click))

    我尝试了什么

    • 检查#If指令文档,它提到了可能影响按钮组合的超时,但是,以不同的速度按下按钮仍会导致CapsLock + LButton热键触发< / LI>
    • 使用嵌套的常规ifelse if和&amp; else陈述 而不是#If指令来改变3键的顺序 热键
    • 使用$修改器阻止3键热键触发CapsLock + LButton热键
    • 将3键热键分成几部分,例如,将一个2键热键放在#If GetKeyState内,即:

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

      这通常会提供正确的消息(shift left click)框,但有时会触发CapsLock热键,提供错误的消息框(capslock

1 个答案:

答案 0 :(得分:2)

您可以测试双键热键内的移位,以实现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