Autohotkey 为什么捷径不';当应用于多个键时,不会有相同的行为

Autohotkey 为什么捷径不';当应用于多个键时,不会有相同的行为,autohotkey,Autohotkey,这是我的问题 我写了一个小的音量控制脚本来控制我的音量,就像windows使用微软键盘的快捷键一样 我有3个功能。两个用于控制音量,另一个用于控制按键的保持状态以继续提高或降低音量 这是密码 ;//************************************************** ;// Volume Mouse Control ;//************************************************** Volum

这是我的问题

我写了一个小的音量控制脚本来控制我的音量,就像windows使用微软键盘的快捷键一样

我有3个功能。两个用于控制音量,另一个用于控制按键的保持状态以继续提高或降低音量

这是密码

    ;//**************************************************
    ;// 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)!此外,如果解决方案对您有效,请接受它。