using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
using System.Windows.Forms;
namespace Mp3Player
{
    public class MciPlay
    {
        //定义API使用的字符串变量
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
        private string Name = "";
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        private string durLength = "";
        [MarshalAs(UnmanagedType.LPTStr, SizeConst = 128)]
        private string TemStr = "";
        int ilong;
        //定义播放状态枚举常量
        public enum State
        {
            mPlaying=1,
            mPause=2,
            mStop=3
        };
        //结构变量
        public struct structMCI
        {
            public bool bMut;
            public int iDur;
            public int iPos;
            public int iVol;
            public int iBal;
            public string iName;
            public State state;
        }
        public structMCI mc = new structMCI();
        public MciPlay()
        {
            //构造函数
        }
        //取得播放文件属性
        public string FileName
        {
            get
            {
                return mc.iName;
            }
            set
            {
                try
                {
                    TemStr = "";
                    TemStr = TemStr.PadLeft(127, Convert.ToChar(" "));
                    Name = Name.PadLeft(260, Convert.ToChar(" "));
                    mc.iName = value;
                    ilong = APIClass.GetShortPathName(mc.iName, Name, Name.Length);
                    Name = GetCurrPath(Name);
                    //Name = "open " + Convert.ToChar(34) + Name + Convert.ToChar(34) + " alias media";
                    
                    ilong = APIClass.mciSendString("stop media", TemStr, TemStr.Length, 0);
                    ilong = APIClass.mciSendString("close media", TemStr, TemStr.Length, 0);
                    MessageBox.Show(ilong.ToString());
                    Name = "open " + Convert.ToChar(34) + Name + Convert.ToChar(34) + " alias media";                    ilong = APIClass.mciSendString(Name, TemStr, TemStr.Length, 0);
                    ilong = APIClass.mciSendString("set media time format milliseconds", TemStr, TemStr.Length, 0);
                    mc.state = State.mStop;
                   
                }
                catch
                {
                    MessageBox.Show("出错错误!");
                }
            }
        }
        public void play()
        {
            TemStr = "";
            TemStr = TemStr.PadLeft(127, Convert.ToChar(" "));
            APIClass.mciSendString("play media", TemStr, TemStr.Length, 0);
            mc.state = State.mPlaying;
        }
        //停止
        public void StopT()
        {
            TemStr = "";
            TemStr = TemStr.PadLeft(128, Convert.ToChar(" "));
            ilong = APIClass.mciSendString("stop media", TemStr, 128, 0);
            ilong = APIClass.mciSendString("close media", TemStr, 128, 0);
            mc.state = State.mStop;
        }        public void Puase()
        {
            TemStr = "";
            TemStr = TemStr.PadLeft(128, Convert.ToChar(" "));
            ilong = APIClass.mciSendString("pause media", TemStr, TemStr.Length, 0);
            mc.state = State.mPause;
        }
        private string GetCurrPath(string name)
        {
            if (name.Length < 1) return "";
            name = name.Trim();
            name = name.Substring(0, name.Length - 1);
            return name;
        }
        //总时间
        public int Duration
        {
            get
            {
                durLength = "";
                durLength = durLength.PadLeft(128, Convert.ToChar(" "));
                APIClass.mciSendString("status media length", durLength, durLength.Length, 0);
                durLength = durLength.Trim();
                if (durLength == "\0")
                {
                    return 0;
                }
                else
                {
                    return (int)(Convert.ToDouble(durLength) / 1000);
                }
            }
        }        //当前时间
        public int CurrentPosition
        {
            get
            {
                durLength = "";
                durLength = durLength.PadLeft(128, Convert.ToChar(" "));
                
                APIClass.mciSendString("status media position", durLength, durLength.Length, 0);
                mc.iPos = (int)(Convert.ToDouble(durLength)/1000);
                return mc.iPos;
            }
        }
        //播放状态
        public int Mp3State()
        {
            return ((int)mc.state);
        }
    }
    public class APIClass
 {
  [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  public static extern int GetShortPathName (
   string lpszLongPath,
   string shortFile,
   int cchBuffer
  );  [DllImport("winmm.dll", EntryPoint="mciSendString", CharSet = CharSet.Auto)]
  public static extern int mciSendString (
   string lpstrCommand,
   string lpstrReturnString,
   int uReturnLength,
   int hwndCallback
  );
 }}

解决方案 »

  1.   

    这是播放MP3的一个类,当我先设置MP3文件名后,再播放,没问题,但是接着调用停止播放命令后,再播放MP3文件,就没反应了,我接着播放别的MP3文件也不行了,为什么?
      

  2.   

    当按下STOP后要检查FileName属性的值情况,是否被正确赋值了,调试一下,估计这里有问题
      

  3.   

    是不是
    ilong = APIClass.mciSendString("close media", TemStr, 128, 0);
    之后,还有再初始化什么的。
      

  4.   

    http://www.cnblogs.com/phinecos/archive/2006/12/14/592557.html
      

  5.   

     ilong = APIClass.mciSendString("close media", TemStr, 128, 0);
    你都把 MEDIA释放了  那播放的时候要重新
     Name = "open " + Convert.ToChar(34) + Name + Convert.ToChar(34) + " alias media";
    ilong = APIClass.mciSendString(Name, TemStr, TemStr.Length, 0);下面你可以参考下
    http://blog.csdn.net/zgke/archive/2008/12/08/3476765.aspx