0

这是我的问题。

我写了一个小音量控制脚本来控制我的音量,就像 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}

保持行为不正常。我需要按两次 Button1/2 才能调用保持行为。为什么 ?

谢谢你的帮助

4

1 回答 1

2

组合

XButton1 & XButton2:: Send {Volume_Mute}
XButton2 & XButton1:: Send {Volume_Mute}

制作XButton1XButton2 前缀键。前缀键的行为略有不同。它们只在释放时触发,这是无法避免的:例如,如果您按下XButton1,您可能会按下XButton2,从而触发组合。只有当你没有按下任何额外的按钮时,XButton1::才会被触发,另一方面在它被释放之前无法确定。
对于您的VolumeHoldTreatment()功能:在这种情况下,GetKeyState()不需要循环。当您按住它时,普通键将继续触发。这就是为什么有些人能够LOL用太多的O字母来生成单词,而只需敲击三个键。
忽略静音功能,这样的事情会完全一样:

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_UpVolume_Down。当你同时按下两个键时,会发生两件事:

  1. 你第一次按下的键将停止射击
  2. 另一个密钥将发送{Volume_Mute}

不幸的是,静音时有两个缺点:a)在发送之前总会发送至少一个Volume_UpVolume_Down(当您需要很长时间按下第二个按钮时甚至更多){Volume_Mute}发送。b) 如果您长时间持有这两个密钥,{Volume_Mute}将一遍又一遍地发送;但这至少不会改变结果。

更新:

s 确实表现出一种奇怪的XButton行为,即当它们被按住时它们不会继续射击。看看这段代码:

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

这与您的代码变得更加相似,但它使用timers而不是循环,使脚本能够在计时器运行之间执行其他代码。此外,我正在使用XButtonN Up::热键,从而在检测密钥释放方面更加精确。其余的应该是不言自明的。如果您不希望计时器在首次运行前等待 100 毫秒,请GoSub, FireVolume...在每个SetTimer.

于 2013-08-30T07:22:41.627 回答