Autohotkey 为什么捷径不';当应用于多个键时,不会有相同的行为
这是我的问题 我写了一个小的音量控制脚本来控制我的音量,就像windows使用微软键盘的快捷键一样 我有3个功能。两个用于控制音量,另一个用于控制按键的保持状态以继续提高或降低音量 这是密码Autohotkey 为什么捷径不';当应用于多个键时,不会有相同的行为,autohotkey,Autohotkey,这是我的问题 我写了一个小的音量控制脚本来控制我的音量,就像windows使用微软键盘的快捷键一样 我有3个功能。两个用于控制音量,另一个用于控制按键的保持状态以继续提高或降低音量 这是密码 ;//************************************************** ;// Volume Mouse Control ;//************************************************** Volum
;//**************************************************
;// Volume Mouse Control
;//**************************************************
VolumeUp(p_numberToDecrease, p_holdToDecrease = true)
{
Send {Volume_Up %p_numberToDecrease%}
if(p_holdtoDecrease)
{
VolumeHoldTreatment("Up")
}
}
VolumeDown(p_numberToDecrease, p_holdToDecrease = true)
{
Send {Volume_Down %p_numberToDecrease%}
if(p_holdtoDecrease)
{
VolumeHoldTreatment("Down")
}
}
VolumeHoldTreatment(p_treatment)
{
Count := 0
Sleep 300
While GetKeyState(A_ThisHotkey,"P")
{
++Count
if(p_treatment == "Up")
{
Send {Volume_Up %Count%}
}
else
{
Send {Volume_Down %Count%}
}
Sleep 25
}
}
当我像这样调用快捷方式中的方法时↓, 它们工作正常
我可以提高和降低音量
如果我按住键超过300毫秒,音量将继续上升/下降
XButton1:: VolumeDown(1)
XButton2:: VolumeUp(1)
但当我添加静音快捷方式时↓
XButton1 & XButton2:: Send {Volume_Mute}
XButton2 & XButton1:: Send {Volume_Mute}
保持行为不正常。我需要按下按钮1/2两次来调用保持行为。为什么?
感谢您的帮助组合
XButton1 & XButton2:: Send {Volume_Mute}
XButton2 & XButton1:: Send {Volume_Mute}
制作XButton1
和XButton2
。前缀键的行为略有不同。它们仅在释放时触发,这是无法避免的:例如,如果按XButton1
,则可能会按XButton2
,从而触发组合。只有当您没有按下任何其他按钮时,才会触发XButton1::
,另一方面,在释放之前无法确定该按钮。对于
VolumeHoldTreatment()
函数:在这种情况下,不需要使用GetKeyState()
的循环。当你按住一把普通的钥匙时,它将继续开火。这就是为什么有些人能够用太多的字母来产生单词LOL
,只需三次击键。忽略静音功能,类似的操作也会执行相同的操作:
XButton1::Send, {Volume_Down}
XButton2::Send, {Volume_Up}
避免使用像XButton1&XButton2这样的组合,从而防止出现前缀键,将为您节省大量的麻烦,例如,可以这样完成:
XButton1::
if( GetKeyState("XButton2") ) {
Send, {Volume_Mute}
} else {
Send, {Volume_Down}
}
return
XButton2::
if( GetKeyState("XButton1") ) {
Send, {Volume_Mute}
} else {
Send, {Volume_Up}
}
return
这几乎可以完美地工作:只要按住一个按钮,它就会一次又一次地被触发,不断地向上或向下发送Volume\u
。只要按下两个键,就会发生两件事:
您先按下的键将停止发射
另一个键将发送{Volume\u Mute}
不幸的是,静音时有两个缺点:a)在发送{Volume\u Mute}
之前,始终至少会发送一个Volume\u Up
或Volume\u Down
(如果长时间按下第二个按钮,情况会更糟)。b) 如果长时间按住两个键,{Volume\u Mute}
将被反复发送;但这至少不会改变结果
更新:
XButton
s确实表现出一种奇怪的行为,即当按下按钮时,它们不会一直开火。查看此代码:
XButton1::
if( GetKeyState("XButton2", "P") ) {
SetTimer, FireVolumeUp, Off
Send, {Volume_Mute}
} else {
SetTimer, FireVolumeDown, 100
}
return
XButton1 Up::
SetTimer, FireVolumeDown, Off
return
XButton2::
if( GetKeyState("XButton1", "P") ) {
SetTimer, FireVolumeDown, Off
Send, {Volume_Mute}
} else {
SetTimer, FireVolumeUp, 100
}
return
XButton2 Up::
SetTimer, FireVolumeUp, Off
return
FireVolumeUp:
Send, {Volume_Up}
return
FireVolumeDown:
Send, {Volume_Down}
return
这与您的代码更加相似,但它使用计时器而不是循环,使脚本能够在计时器运行之间执行其他代码。此外,我还使用了XButtonN Up::
热键,从而提高了检测按键释放的精度。其余的应该是不言自明的。如果您不希望计时器在第一次运行前等待100毫秒,请在每个设置计时器之前添加GoSub,FireVolume…
,非常感谢您的解释。这对我理解AutoHotkey在后台做什么有很大帮助。但是,当我运行您的脚本时,卷不会像您所说的那样多次触发。可能是因为它们不是“法线键”?@Tareck117你完全正确。当我写代码的时候,我无法测试它。看看更新。希望它现在能工作。谢谢你的更新,它现在工作得很好。另外,谢谢你的解释。您知道自动热键中是否有一种方法可以在参数中传递热键,然后根据热键创建泛型方法吗?我想用你的方法创建一个通用插件。@Tareck117使用这个命令(duh)!此外,如果解决方案对您有效,请接受它。