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

标签 autohotkey

问题

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

问题

  1. 为什么会发生这种情况?

  2. 如何为LShift+CapsLock+LButton触发正确的消息框(左键单击) 热键?

代码

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,出现不正确的消息框(左键单击)(message box (左键单击 Shift)应该已经出现)
  • CapsLock+LShift+LButton,出现不正确的消息框(左键单击)(message box (左键单击 Shift)应该已经出现)

我尝试过的

  • 检查 #If指令文档中,它提到了可能影响按钮组合的超时,但是,以不同的速度按下按钮仍然会导致 CapsLock+LButton 热键触发
  • 使用嵌套的常规 ifelse ifelse 语句 而不是使用 #If 指令来更改 3 键的顺序 热键
  • 使用 $ 修饰符防止 3 键热键触发 CapsLock+LButton 热键
  • 将 3 键热键分成几部分,例如,将 2 键热键放入 #If GetKeyState 中,即:

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

    这通常会给出正确的消息框(左键单击 Shift),但有时会触发 CapsLock 热键,给出错误的消息框(capslock)

最佳答案

您可以在 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
    

关于autohotkey - 使用 GetKeyState 创建 3 键热键,而不触发另一个类似的 2 键热键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49590585/

相关文章:

windows - 有没有办法一次制作多个窗口 "active"?在 Windows 中?

autohotkey - 如何在 AutoHotkey 中添加等待期?

windows - Autohotkey(ahk)GUI十字线实现

macros - AHK : {space} not working?

javascript - 从javascript触发击键

autohotkey - 创建以冒号结尾的 AutoHotkey 条目

html-email - 通过带有表情符号的 ahk 发送电子邮件会产生问题

javascript - 全局窗口热键在 chrome 窗口最小化时调用 js 函数

text - AutoHotKey:即时文本替换

powershell - 从 autohotkey 运行 powershell 脚本时执行策略错误