Autohotkey 使用GetKeyState创建3键热键而不触发另一个类似的2键热键
问题 当按下3键热键(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
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
指令来更改3键的顺序 热键#If
- 使用
修改器防止3键热键触发$
+CapsLock
热键LButton
- 将3键热键分解为多个部分,例如,将2键热键放入
#If
,即:GetKeyState
这通常会给出正确的消息框(#If GetKeyState("LShift", "P") CapsLock & LButton:: MsgBox, "shift left click" return #If
),但有时会触发CapsLock热键,给出错误的消息框(shift left click
)CapsLock
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