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

 

让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文件里了。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值