在鼠标向上事件时停止声音播放器



dr 版本:如何在 WinForms 按钮的鼠标按下事件中开始播放声音,并阻止它在同一按钮的鼠标向上事件中播放?

中级 C# 开发在这里,我一直在尝试编写一个简单的 Simon 克隆。

我目前试图让它仅在用户单击按钮时播放彩色按钮的声音。(我交替使用"按钮"和"磁贴"。两者都是指用户将在表单上按下的彩色按钮)

我最初尝试过这个:

public partial class frmMain : Form
{
    private SoundPlayer soundPlayer;
    private void btnGreenTile_MouseDown(object sender, MouseEventArgs e)
    {
        soundPlayer = new SoundPlayer(Properties.Resources.greenTileSound)
        soundPlayer.Play();
    }
    private void btnGreenTile_MouseUp(object sender, MouseEventArgs e)
    {
        soundPlayer.Stop();
    }
}

但这并没有停止声音,因为 MouseUp 事件没有因 MouseDown 未完成而触发(仍在播放大约 5 秒长的声音,以防有人按住按钮的时间超过简单的单击时间)。正如路易斯·泰勒兹(Luis Tellez)在评论中提到的,SoundPlayer在其上播放声音是一个新的线程......所以我不知道为什么这段代码现在不起作用。

所以我研究了多线程并尝试了这个:

public partial class frmMain : Form
{
    private Thread soundThread = new Thread(new ParameterizedThreadStart(PlaySound));
    // Create stream objects for each sound (needed to allow SoundPlayer to use Resources)
    private Stream greenTileSound = Properties.Resources.greenTilePress;
    private Stream redTileSound = Properties.Resources.redTilePress;
    private Stream yellowTileSound = Properties.Resources.yellowTilePress;
    private Stream blueTileSound = Properties.Resources.blueTilePress;
    public frmMain()
    {
        InitializeComponent();
    }
    private void btnGreenTile_MouseDown(object sender, MouseEventArgs e)
    {
        soundThread.Start(greenTileSound); 
    }
    private void btnGreenTile_MouseUp(object sender, MouseEventArgs e)
    {
        soundThread.Abort();
    }
    // Have to use object as parameter because ParamterizedThreadStart() only takes object arguments
    private static void PlaySound(object soundToPlay)
    {
        SoundPlayer soundPlayer = new SoundPlayer((Stream)soundToPlay);
        soundPlayer.Play();
    }
} 

使用上面的代码,它不会停止在 MouseUp 上播放声音,更好的是它会抛出一个 ThreadStateException,并显示消息"线程正在运行或终止;它无法重新启动。

正如您可能知道的那样,我只是在尝试编写此代码时才了解多线程。我必须使用ParameterizedThreadStart,因为它在线程启动时调用的方法PlaySound()需要将参数传递给soundPlayer,其中包含与播放器按下的彩色按钮(.wav文件)相对应的资源。

然后我想也许我应该尝试使用 soundThread.Suspend() 而不是 soundThread.Abort() 但 Suspend 已被弃用......

谁能指出我正确的方向,让声音停止在 MouseUp 上?我需要使用多线程吗?我认为我的问题归结为逻辑,但我完全陷入困境。感谢您的任何帮助!:)

作为旁注,我很惊讶这个问题或类似的东西还没有被问到(至少我无法通过谷歌搜索或stackExchange搜索找到它)。

您可以在文档中看到 play() 方法在其他线程中运行,您可以在它之后执行其他操作,它应该运行,因此您对第一种方法的问题与您的想法不同。

Play 方法使用新线程播放声音。如果您调用"播放" 在将.wav文件加载到内存之前,.wav文件将 在播放开始之前加载。您可以使用 LoadAsync 或 Load 提前将.wav文件加载到内存的方法。.wav文件之后 已成功从流或 URL 加载,将来调用播放 SoundPlayer 的方法不需要重新加载.wav文件 直到声音的路径发生变化。如果.wav文件尚未 指定或加载失败,Play 方法将播放默认值 哔哔声。

http://msdn.microsoft.com/en-us/library/system.media.soundplayer.play%28v=vs.110%29.aspx

相关内容

  • 没有找到相关文章

最新更新