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

Autohotkey 使用GetKeyState创建3键热键而不触发另一个类似的2键热键,autohotkey,Autohotkey,问题 当按下3键热键(LShift+CapsLock+LButton)时,将触发类似的2键热键(CapsLock+LButton) 问题 为什么会这样 如何为LShift+CapsLock+LButton热键触发正确的消息框(shift left click) 代码 SetCapsLockState, AlwaysOff CapsLock:: MsgBox, "capslock" return CapsLock & LButton:: MsgBox, "left clic

问题

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

问题

  • 为什么会这样

  • 如何为
    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
    
    示例场景

    • CapsLock
      ,出现正确的消息框(
      CapsLock
    • CapsLock
      +
      LButton
      ,出现正确的消息框(
      左键单击
    • LShift
      +
      CapsLock
      +
      LButton
      ,出现不正确的消息框(
      左键单击
      )(消息框(
      左键单击
      )本应出现)
    • CapsLock
      +
      LShift
      +
      LButton
      ,出现不正确的消息框(
      左键单击
      )(消息框(
      左键单击
      )本应出现)
    我尝试过的

    • 查看指令文档时,它提到了可能影响按钮组合的超时,但是,以不同的速度按下按钮仍然会触发
      CapsLock
      +
      LButton
      热键
    • 使用嵌套的常规
      if
      else-if
      ,&
      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


    您可以在2键热键内测试shift键,以实现
    CapsLock+LButton
    CapsLock+shift+LButton

    SetCapsLockState, AlwaysOff
    
    CapsLock::
        MsgBox, "capslock"
    return
    
    CapsLock & LButton::
        if (GetKeyState("LShift", "P")) {
            MsgBox, "shift left click"
        }
        else {
            MsgBox, "left click"
        }
    return
    
    避免类似热键的代码重复:

    • 使用

    • 使用


    • if(GetKeyState(“LShift”,“P”))
      CapsLock&LButton
      热键中的
      if(GetKeyState(“LShift”,“P”))呢?@JoshBrobst我试过了()
      if(GetKeyState(“LShift”,“P”))
      CapsLock&LButton
      中使用
      \If
      和常规
      If
      /
      否则
      都会停止
      CapsLock&LButton
      &三键热键启动它们的
      MsgBox
      哦,我的意思是使用If语句的真实部分来实现三键热键,@JoshBrobst绝妙的主意,这是可行的&比我以前的解决方案更稳定(当
      LShift
      是热键触发后释放的最后一个键时,例如
      LShift
      down+
      CapsLock
      down,则
      CapsLock
      up+
      LShift
      up不会正确触发
      CapsLock
      热键,但如果CapsLock是热键触发后释放的最后一个键,则会触发
      CapsLock
      s触发)@JoshBrobst你能把你的解决方案作为这个问题的答案,这样它就可以被接受,这样其他有类似问题的人就可以更快地找到它吗?谢谢,这很有效。如果我有多个2键热键(例如,
      CapsLock
      +
      LButton
      CapsLock
      +
      RButton
      ),这会导致代码重复()。有没有办法重构您的解决方案以避免代码重复?是的,因为热键实际上是可用的,您只需将
      CapsLock&RButton::
      放在
      CapsLock&LButton::
      右上方的行上,它们将运行相同的代码。然后,您可以根据左或右按钮对分支进行测试以更改消息。或者,你可以分离热键并将其移动到函数中。我将在答案中添加一个示例。好主意,函数和a_this热键方法都有效(函数方法似乎更简洁易读),+1减少代码重复,非常感谢您的帮助:)乐于助人!我绝对同意使用函数更清晰。我尽可能使用函数而不是子程序/命令。
      CapsLock & RButton::CapsMouseHandler("right")
      CapsLock & LButton::CapsMouseHandler("left")
      
      CapsMouseHandler(btnString) {
          if (GetKeyState("LShift", "P")) {
              MsgBox % "shift " btnString " click"
          }
          else {
              MsgBox % btnString " click"
          }
      }
      
      CapsLock & RButton::
      CapsLock & LButton::
          btnString := InStr(A_ThisHotkey, "LButton") ? "left" : "right"
          if (GetKeyState("LShift", "P")) {
              MsgBox % "shift " btnString " click"
          }
          else {
              MsgBox % btnString " click"
          }
      return