5

我正在编写一个Windows 窗体应用程序,它应该播放三个声音文件,并且在每个声音文件的末尾,它是为了更改图像的来源。

我可以让它播放声音System.Media.SoundPlayer。然而,它似乎在不同的线程中播放声音,继续。

这样做的最终效果是只播放最后一个声音并且所有图像都发生了变化。

我试过Thread.Sleep了,但它让整个 GUI 都处于睡眠状态,并且在睡眠期之后,一切都会立即发生,并且它播放的最后一个声音。

更新

我认为 PlaySynch 正在工作,但它似乎冻结了我的 GUI,这不太理想。我还可以做些什么?

4

5 回答 5

11

您是否尝试过 SoundPlayer.PlaySync 方法?从帮助:

PlaySync 方法使用当前线程播放 .wav 文件,阻止线程在加载完成之前处理其他消息。

于 2008-09-29T13:44:20.253 回答
1

不要使用 Play 方法,而是使用PlaySync方法。

于 2008-09-29T13:46:46.300 回答
1

使用此代码:

[DllImport("WinMM.dll")]
public static extern bool  PlaySound(byte[]wfname, int fuSound);

//  flag values for SoundFlags argument on PlaySound
public static int SND_SYNC        = 0x0000;      // Play synchronously (default).
public static int SND_ASYNC       = 0x0001;      // Play asynchronously.
public static int SND_NODEFAULT   = 0x0002;      // Silence (!default) if sound not found.
public static int SND_MEMORY      = 0x0004;      // PszSound points to a memory file.
public static int SND_LOOP        = 0x0008;      // Loop the sound until next sndPlaySound.
public static int SND_NOSTOP      = 0x0010;      // Don't stop any currently playing sound.
public static int SND_NOWAIT      = 0x00002000;  // Don't wait if the driver is busy.
public static int SND_ALIAS       = 0x00010000;  // Name is a registry alias.
public static int SND_ALIAS_ID    = 0x00110000;  // Alias is a predefined ID.
public static int SND_FILENAME    = 0x00020000;  // Name is file name.
public static int SND_RESOURCE    = 0x00040004;  // Name is resource name or atom.
public static int SND_PURGE       = 0x0040;      // Purge non-static events for task.
public static int SND_APPLICATION = 0x0080;      // Look for application-specific association.
private Thread t; // used for pausing
private string bname;
private int soundFlags;

//-----------------------------------------------------------------
public void Play(string wfname, int SoundFlags)
{
    byte[] bname = new Byte[256];    //Max path length
    bname = System.Text.Encoding.ASCII.GetBytes(wfname);
            this.bname = bname;
            this.soundFlags = SoundFlags;
            t = new Thread(play);
            t.Start();
}
//-----------------------------------------------------------------

private void play()
{
    PlaySound(bname, soundFlags)
}

public void StopPlay()
{
    t.Stop();
}

public void Pause()
{
    t.Suspend(); // Yeah, I know it's obsolete, but it works.
}

public void Resume()
{
    t.Resume(); // Yeah, I know it's obsolete, but it works.
}
于 2009-05-14T21:23:38.393 回答
0

您可能想要做的是做一个异步声音,然后以不响应用户响应的方式禁用您的 UI。然后,一旦播放了声音,您就可以重新启用您的 UI。这将允许您仍然像往常一样绘制 UI。

于 2008-09-29T13:54:48.217 回答
0

我想出了怎么做。我使用了 PlaySynch,但我在一个单独的线程中对绘制 UI 的代码进行了播放。播放每个文件后,同一线程还会更新 UI。

于 2008-09-29T14:03:15.827 回答