none
关于调用winmm.dll播放wav的问题 RRS feed

  • 问题

  • 使用了toolbar,可以选择播放第几首歌曲。
    请问该怎么使用?
    我手头倒是有个例子,可是使用了之后提示 PInvoke堆栈不对称,然后我把
    private static extern long mciSendString(string lpstrCommand,string lpstrReturnString,long length,long hwndcallback);
    里的long都改成int,程序是可以运行了,但是点按钮之后不播放歌曲。

    2009年5月10日 10:47

答案

  • 如果你只是播放wav文件
    可以使用System.Media.SoundPlayer类
    SoundPlayer splayer=new SoundPlayer(filename);
    splayer.Play(); //播放
    // splayer.PlayLooping();  循环播放
    splayer.Stop();//停止

    • 已标记为答案 黄昏 2009年5月10日 12:35
    2009年5月10日 11:19

全部回复

  • using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;

    namespace 播放音乐
    {
        public enum PlaySoundFlags : int
        {
            SND_SYNC = 0x0, // play synchronously (default)
            SND_ASYNC = 0x1, // play asynchronously
            SND_NODEFAULT = 0x2, // silence (!default) if sound not found
            SND_MEMORY = 0x4, // pszSound points to a memory file
            SND_LOOP = 0x8, // loop the sound until next sndPlaySound
            SND_NOSTOP = 0x10, // don't stop any currently playing sound
            SND_NOWAIT = 0x2000, // don't wait if the driver is busy
            SND_ALIAS = 0x10000, // name is a registry alias
            SND_ALIAS_ID = 0x110000,// alias is a predefined ID
            SND_FILENAME = 0x20000, // name is file name
            SND_RESOURCE = 0x40004, // name is resource name or atom
        };
        class PlayMusic
        {
            public PlayMusic()
            {
                //
                // TODO: 在此处添加构造函数逻辑
                //
            }

            //  [DllImport("winmm.dll")]
            //  private static extern long PlaySound(String fileName,long a,long b);

            public static void Play(string p_FileName)
            {
                try
                {
                    mciSendString(@"close " + p_FileName, "                                  ", 0, 0);
                    mciSendString(@"open " + p_FileName, "                                  ", 0, 0);
                    mciSendString(@"play " + p_FileName, "                                  ", 0, 0);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

            }

            [DllImport("winmm.dll")]
            private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, int length, int hwndcallback);


            /// <summary>
            /// 停止当前音乐播放
            /// </summary>
            /// <param name="fileName">音乐文件名称</param>
            public static void StopMusic(string fileName)
            {
                try
                {
                    mciSendString(@"close " + fileName, "                                  ", 0, 0);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
    }

    2009年5月10日 11:11
  • 如果你只是播放wav文件
    可以使用System.Media.SoundPlayer类
    SoundPlayer splayer=new SoundPlayer(filename);
    splayer.Play(); //播放
    // splayer.PlayLooping();  循环播放
    splayer.Stop();//停止

    • 已标记为答案 黄昏 2009年5月10日 12:35
    2009年5月10日 11:19
  • 嗯,我刚试过了,你这种方法也可以播放。
    我现在使用了toolbar和centextMenu,menuitem,ToolBarButton。
    要能选择播放第几首歌,还可以播放暂停。
    请问怎么判断?

    2009年5月10日 12:04
  • 问题解决了,谢谢
    2009年5月10日 12:35
  • 修改filename的值就可以指定播放你想要播放的歌
    解决了就好,不用客气
    Best Regards!

    2009年5月10日 12:44