问题
当按下 3 键热键 (LShift
+CapsLock
+LButton
) 时,类似的 2 键热键 (CapsLock
+LButton
) 被触发。
问题
为什么会发生这种情况?
如何为
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
热键触发 - 使用嵌套的常规
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
),但有时会触发 CapsLock 热键,给出错误的消息框(capslock
)
最佳答案
您可以在 2 键热键内测试 Shift 来实现 CapsLock + LButton
和 CapsLock + 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" } }
-
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/