使用 GetKeyState 创建 3 键热键而不触发另一个类似的 2 键热键
Using GetKeyState to create 3 key hotkey without triggering another similar 2 key hotkey
问题
当一个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
,出现正确的消息框(left click
)
- 按
LShift
+CapsLock
+LButton
,出现不正确的消息框(left click
)(应该是消息框(shift left click
)出现)
- 按
CapsLock
+LShift
+LButton
,出现不正确的消息框(left click
)(应该是消息框(shift left click
)出现)
我试过的
- 检查
#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 left click
) 框,但有时会触发 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
问题
当一个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
,出现正确的消息框(left click
) - 按
LShift
+CapsLock
+LButton
,出现不正确的消息框(left click
)(应该是消息框(shift left click
)出现) - 按
CapsLock
+LShift
+LButton
,出现不正确的消息框(left click
)(应该是消息框(shift left click
)出现)
我试过的
- 检查
#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 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
避免类似热键的代码重复:
使用 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