您的位置:首页 > 编程语言 > C#

C# winform使用系统API播放音乐(非调用控件)

2009-11-26 11:17 1071 查看
让winform使用系统API播放音乐,这样做的好处是程序不用调用其他播放器控件的DLL,可以直接把音乐集成到程序里,最后只生成一个exe文件。这种方式唯一的局限性在于所播放的音乐只能是wav格式的音频文件。

这里我总结了3种方式:

第一种(.net API):

引用命名空间:using System.Media;

然后声明对象

SoundPlayer sp = new SoundPlayer();

这里有2个重载,一是wav文件的url,另一个是数据流

播放与停止方法:sp.Play(); , sp.Stop();

第二种(windows API):

引用命名空间:System.Runtime.InteropServices;

[Flags]
private enum PlaySoundFlags : int
{
SND_SYNC = 0x0000, //同步
SND_ASYNC = 0x0001, //异步
SND_NODEFAULT = 0x0002,
SND_MEMORY = 0x0004,
SND_LOOP = 0x0008,
SND_NOSTOP = 0x0010,
SND_NOWAIT = 0x00002000,
SND_ALIAS = 0x00010000,
SND_ALIAS_ID = 0x00110000,
SND_FILENAME = 0x00020000,
SND_RESOURCE = 0x00040004
}

[DllImport("winmm")]
private static extern bool PlaySound(string szSound,
IntPtr hMod, PlaySoundFlags flags);

//播放音乐,参数为wav文件路径

public static void Play(string strFileName)
{

//调用PlaySound方法,播放音乐
PlaySound(strFileName, IntPtr.Zero,PlaySoundFlags.SND_ASYNC);
}

//停止播放
public static void Stop()
{
PlaySound(null, IntPtr.Zero,PlaySoundFlags.SND_ASYNC);
}

这种方式只能播放本地磁盘上的wav文件,不能播放数据流

第三种(windows API):

引用命名空间:System.Runtime.InteropServices;

[DllImport("winmm.dll", EntryPoint = "sndPlaySound")]
private static extern bool sndPlaySound(ref Byte snd, int fuSound);

private static System.Byte[] sound;
private void play()
{
sound = new byte[数据流.Length];
数据流.Read(sound, 0, sound.Length);
sndPlaySound(ref sound[0], 0x05); //0x05表示异步
}
这种方式能播放数据流,但不能播放文件路径,不过当然可以先取得文件路径再转换成数据流进行播放。

试想如果程序能播放数据流的话,那就可以把音频文件集成到exe文件里了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: