2010-05-26 42 views
0

我正在设置一个警报,弹出一个对话框,用户可以从中选择多个声音文件选项。我遇到的问题是在本地创建一个声音播放器,我可以用一个按钮关闭它。我遇到的问题是,当我关闭窗体时声音保持循环,因为SoundPlayer在按钮单击事件中不存在。在本地停止SoundPlayer循环

这里就是我有:

void callsound() 
    { 
     if (SoundToggle == 0) // if sound enabled 
     { 

      if ((SoundFile == 0) && (File.Exists(@"attention.wav"))) 
      { 
       System.Media.SoundPlayer alarm = new System.Media.SoundPlayer(@"attention.wav"); 
       alarm.PlayLooping(); 
      } 
     if ((SoundFile == 1) && (File.Exists(@"aahh.wav"))) 
      { 
       System.Media.SoundPlayer alarm = new System.Media.SoundPlayer(@"aahh.wav"); 
       alarm.PlayLooping(); 
      } 
    } 

private void button1_Click(object sender, EventArgs e) 
    { 
     //alarm.Stop(); Only works if SoundPlayer declared at class level 
     this.Close(); 
    } 

有没有一种方法可以让我做什么,我想通过声明的声音播放情况下我在哪里呢?或者有什么方法可以在课堂上声明它,并且仍然可以根据用户设置更改声音文件?

回答

1

为什么这是一个问题?无论如何,SoundPlayer不支持同时播放多个声音。将其移至类作用域,重写OnFormClosing事件,解决问题。

public partial class Form1 : Form { 
    private System.Media.SoundPlayer alarm; 

    protected override void OnFormClosing(CancelEventArgs e) { 
    if (alarm != null) alarm.Stop(); 
    } 
} 
+0

这是一个问题,因为这是我第一次使用SoundPlayer,我仍然试图找出它。 它告诉我“OnFormClosing”需要返回类型。我该如何去处理这个问题?我不知道它是什么意思 – EvanRyan 2010-05-26 21:34:09

+0

呃,让它成为一个空白,这次发布更新和验证 – 2010-05-26 21:44:13

+0

谢谢你的澄清,现在我要看看我能不能弄清楚如何把它们拼凑在一起我对C#还是很陌生的,所以这对我来说全新的。 – EvanRyan 2010-05-26 21:57:20

0

你可以试试:

SoundMixer.stopAll(); 

SoundMixer.soundTransform = new SoundTransform(0); 

SoundMixer类控制全局声音,所以应该停止在同一个安全沙箱中的一切。

0

使用PowerShell,我跟打.wav文件播放,并使用开始重复循环如下:

$Playwav = new-object ('Media.SoundPlayer') $playpath1 
$Playwav.PlayLooping() 

我通过运行科(F8)停止Powershell的IDE内部循环:

$Playwav = new-object ('Media.SoundPlayer') $playpath1 
$Playwav.PlayLooping() 
$Playwav.stop() 

FWIW,我的例子中的.wav是FPS Doug takethatbitch.wav.所以失控的循环让我发笑。

希望这会有所帮助。