private void Form1_Load(object sender, EventArgs e)
        {
            //CheckForIllegalCrossThreadCalls = False;
            Thread th = new Thread(ReceiveMsg); 
            th.IsBackground = true;
            th.Start();
            clsMCI cm = new clsMCI();
            cm.FileName = "voice/time0.mp3";
            cm.play();        }
        void ReceiveMsg()
        {
            //cm.FileName = "voice/start.mp3";
            //cm.play();
            //cm.StopT();
            ////Thread.Sleep(10 * 1000);  
            //clsMCI cm1 = new clsMCI();
            //cm.FileName = "voice/time0.mp3";
            //cm.play();
            clsMCI cm = new clsMCI();
            cm.FileName = "voice/time0.mp3";
            cm.play();

解决方案 »

  1.   

    using System;using System.Runtime.InteropServices; using System.Text; using System.IO ;using System.Windows.Forms; namespace jingling{/// <summary>/// clsMci 的摘要说明。/// </summary> public class clsMCI{public clsMCI(){//// TODO: 在此处添加构造函数逻辑//  }//定义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,mPuase = 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 string FileName{get{return mc.iName;}set{//ASCIIEncoding asc = new ASCIIEncoding();     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";     Name = "open " + Convert.ToChar(34) + Name + Convert.ToChar(34) + " alias media";ilong = APIClass.mciSendString("close all", TemStr, TemStr.Length , 0);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{}}}//播放  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("close media", TemStr, 128, 0);ilong = APIClass.mciSendString("close all", 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.mPuase ; }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 == "") return 0;return (int)(Convert.ToDouble(durLength) / 1000f); }}//当前时间  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) / 1000f);return mc.iPos;}}}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);}}这个是网上找的 bass.dll 一直没找到怎么用?
      

  2.   

     ReceiveMsg()
    FileName使用绝对路径
      

  3.   

    cm.FileName = @"d:\Users\Biqi\Desktop\Study\精灵\jingling\jingling\bin\Debug\voice\time0.mp3";这样
      

  4.   

    把clsMCI cm = new clsMCI();
    定义成全局变量试试
    话说,把play()放到线程里,没看出有什么意义
    本来不就是后台线程运行的吗,又不会阻塞
      

  5.   

    哎 不知道什么原因,调试的时候代码都是经过的!
    最后我用的timer   但到了23点他报错 真无奈!