Autohotkey 使用自动热键播放numpad中按下的数字

Autohotkey 使用自动热键播放numpad中按下的数字,autohotkey,Autohotkey,当我按下numpad中的数字时,我需要播放所按下数字的波形文件 我使用了以下代码 ~Numpad1::SoundPlay, 1.wav, wait return ~Numpad2::SoundPlay, 2.wav , wait return ~Numpad3::SoundPlay, 3.wav, wait return 当我单独按下每一个数字时,它播放得很好。但当我按顺序按123时,我只能听到最后一个波(所以当按123时,我只能听到3.wav)。我需要按顺序听一二三,有什么办法吗?来自:

当我按下numpad中的数字时,我需要播放所按下数字的波形文件

我使用了以下代码

~Numpad1::SoundPlay, 1.wav, wait
return

~Numpad2::SoundPlay, 2.wav , wait
return

~Numpad3::SoundPlay, 3.wav, wait
return
当我单独按下每一个数字时,它播放得很好。但当我按顺序按123时,我只能听到最后一个波(所以当按123时,我只能听到3.wav)。我需要按顺序听一二三,有什么办法吗?

来自:

如果正在播放一个文件,而当前脚本播放第二个文件,则会停止第一个文件,以便第二个文件可以播放。在某些系统上,即使完全独立的脚本播放新文件,某些文件类型也可能停止播放

因此,为热键编写单独的脚本似乎是您可以尝试的唯一简单解决方案。
更高级的解决方案将包括更多地手动使用内部窗口(或外部)功能,以更好地控制播放声音。
例如,可以使用启动声音播放器中的音频文件。我想说,任何一个像样的声音播放器都可以播放命令行参数的声音。即使你看不到任何声音播放器在你的屏幕上弹出,你也可能做到这一点。(如果不是,我想也可以手动隐藏)

编辑:
可能误解了这个问题,我的答案是同时播放多个声音。

来自:

如果正在播放一个文件,而当前脚本播放第二个文件,则会停止第一个文件,以便第二个文件可以播放。在某些系统上,即使完全独立的脚本播放新文件,某些文件类型也可能停止播放

因此,为热键编写单独的脚本似乎是您可以尝试的唯一简单解决方案。
更高级的解决方案将包括更多地手动使用内部窗口(或外部)功能,以更好地控制播放声音。
例如,可以使用启动声音播放器中的音频文件。我想说,任何一个像样的声音播放器都可以播放命令行参数的声音。即使你看不到任何声音播放器在你的屏幕上弹出,你也可能做到这一点。(如果不是,我想也可以手动隐藏)

编辑:

可能误解了这个问题,我的答案是同时播放多个声音。

为了解决这个问题,我使用数组作为缓冲区来捕获输入。然后,我让脚本获取数组的第一个元素,在一个开关中使用它来确定播放哪个声音,然后删除我们正在使用的第一个元素,以便转到缓冲区中的下一个声音。如果我刚才说的没有多大意义,代码本身可能会更容易理解

代码如下:

#SingleInstance Force

Buffer:=[]
Loop{
    
    Loop 1{
        tempVar := Buffer[A_Index]
        Buffer.Remove(A_Index)
    }
    if(tempVar){
        switch tempVar
        {
        Case 1:
            SoundPlay, 1.wav, wait
            tempVar:=0
        Case 2:
            SoundPlay, 2.wav, wait
            tempVar:=0
        Case 3:
            SoundPlay, 3.wav, wait
            tempVar:=0
        Default:
        }
        
    }
    
}


~Numpad1::Buffer.Push(1)
~Numpad2::Buffer.Push(2)
~Numpad3::Buffer.Push(3)

为了解决这个问题,我使用数组作为缓冲区来捕获输入。然后,我让脚本获取数组的第一个元素,在一个开关中使用它来确定播放哪个声音,然后删除我们正在使用的第一个元素,以便转到缓冲区中的下一个声音。如果我刚才说的没有多大意义,代码本身可能会更容易理解

代码如下:

#SingleInstance Force

Buffer:=[]
Loop{
    
    Loop 1{
        tempVar := Buffer[A_Index]
        Buffer.Remove(A_Index)
    }
    if(tempVar){
        switch tempVar
        {
        Case 1:
            SoundPlay, 1.wav, wait
            tempVar:=0
        Case 2:
            SoundPlay, 2.wav, wait
            tempVar:=0
        Case 3:
            SoundPlay, 3.wav, wait
            tempVar:=0
        Default:
        }
        
    }
    
}


~Numpad1::Buffer.Push(1)
~Numpad2::Buffer.Push(2)
~Numpad3::Buffer.Push(3)

我修改了@Spyre的代码,使它稍微短一点。下面是完整的脚本

#SingleInstance Force

;place all the wav files in same folder as this script. waves should be like 1.wav, 2.wav... wave for zero should be renamed as 99.wav 


Buffer:=[]
Loop{
    tempVar := Buffer[1]

    if(tempVar){
           
            SoundPlay, %tempVar%.wav, wait
            tempVar:=0
            Buffer.Remove(1)       
    }
    
}


~Numpad1::Buffer.Push(1)
~Numpad2::Buffer.Push(2)
~Numpad3::Buffer.Push(3)
~Numpad4::Buffer.Push(4)
~Numpad5::Buffer.Push(5)
~Numpad6::Buffer.Push(6)
~Numpad7::Buffer.Push(7)
~Numpad8::Buffer.Push(8)
~Numpad9::Buffer.Push(9)
~Numpad0::Buffer.Push(99) 

;To stop playing if too many keys are pressed at once
~*Escape::
Buffer:=[]
return

我修改了@Spyre的代码,使它稍微短一点。下面是完整的脚本

#SingleInstance Force

;place all the wav files in same folder as this script. waves should be like 1.wav, 2.wav... wave for zero should be renamed as 99.wav 


Buffer:=[]
Loop{
    tempVar := Buffer[1]

    if(tempVar){
           
            SoundPlay, %tempVar%.wav, wait
            tempVar:=0
            Buffer.Remove(1)       
    }
    
}


~Numpad1::Buffer.Push(1)
~Numpad2::Buffer.Push(2)
~Numpad3::Buffer.Push(3)
~Numpad4::Buffer.Push(4)
~Numpad5::Buffer.Push(5)
~Numpad6::Buffer.Push(6)
~Numpad7::Buffer.Push(7)
~Numpad8::Buffer.Push(8)
~Numpad9::Buffer.Push(9)
~Numpad0::Buffer.Push(99) 

;To stop playing if too many keys are pressed at once
~*Escape::
Buffer:=[]
return

谢谢你的回答。内循环(循环1)的用途是什么。当我在没有循环的情况下把代码放进去时,它的效果也一样好。无论如何,它只运行了一次,为什么要放它?为了获取数组的第一个元素,出于某种原因,我无法使用
Buffer[0]
/
Buffer[1]
。因此,我查看了文档,发现所有从数组中检索值的示例都使用循环的索引变量来指定要提取的数组成员。因此,我只是将循环设置为运行一次,以便
A_索引
只引用数组的第一个元素。也许有更好的方法,但这是我当时找到的最快的解决方案。好吧,对我来说,它没有内部循环。我会将我的代码作为不同的答案发布。(还修改了代码使其更短)是的,这对你来说是一个很好的观察。我最近[在这篇文章之后]更新了我的AHK版本,所以它可能只是旧版本的问题。谢谢你的回答。内循环(循环1)的用途是什么。当我在没有循环的情况下把代码放进去时,它的效果也一样好。无论如何,它只运行了一次,为什么要放它?为了获取数组的第一个元素,出于某种原因,我无法使用
Buffer[0]
/
Buffer[1]
。因此,我查看了文档,发现所有从数组中检索值的示例都使用循环的索引变量来指定要提取的数组成员。因此,我只是将循环设置为运行一次,以便
A_索引
只引用数组的第一个元素。也许有更好的方法,但这是我当时找到的最快的解决方案。好吧,对我来说,它没有内部循环。我会将我的代码作为不同的答案发布。(还修改了代码使其更短)是的,这对你来说是一个很好的观察。我最近[在这篇文章之后]更新了我的AHK版本,所以它可能只是旧版本的问题。