我只想让他顺序播放mp3,选定一些mp3文件后,将文件名排队,利用循环一个一个进行:mciSendString(@"open "+路径和文件名+" alias song", null, 0, 0); 
mciSendString("play song", null, 0, 0); 我发现循环一闪而过,只播放了最后一首歌.于是去网上寻找答案,发现可以check 播放的status,我就想不断去检查status, 如果一首播放完毕再播下一首:string status="";
status = status.PadLeft(128, Convert.ToChar(" "));
mciSendString("status song mode", status, status.Length, 0);我获取的status永远是空,我用"status song length","status song position",等等其他一些命令参数都无法获取status。难道是mp3格式的问题?另:我觉得应该有更简单的办法,比如设定什么全局参数能直接让它sync调用顺序播放求助。  
Thanks in advance!

解决方案 »

  1.   

    我google了个遍,发现只有一位老兄跟我的情况一样,但是没有解决办法:
    http://social.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/75157818-f0df-4881-b79f-0d32efe6b05c
      

  2.   

    这个问题有点难,但说难也不难,你那样做事很不对的,浪费内存,MIC是底层调用,你播放玩后,MIC会把消息返回给操作系统,那么这就简单了,
     protected override void WndProc(ref System.Windows.Forms.Message m)
            {
                
                        switch (m.Msg)
                {                case MM_MCINOTIFY: 
                    // 这里可以播放下一首歌曲
                 
                    break;
            }
                base.WndProc(ref m);        }
      

  3.   

    多谢指教,我一会儿去试试。刚发现MIC这个东西不久,还不太懂。还有,请问:
    1. 我那样做为什么会浪费内存?怎样做才不浪费呢?
    2. 我想更深入了解MCI,就像"MM_MCINOTIFY"这样的参数,你不说我都不知道,能给点资源否?多谢啦!
      

  4.   


    我还是不太会用。 MM_MCINOTIFY的值该怎么设置呢?另外,既然mciSendString定义了“status”参数,为什么我的“status song mode”会不生效呢?
      

  5.   

    可能是Dll引用的时候没有指定charSet:
    CharSet 对于字符集,并非所有版本的 Windows 都是同样创建的。Windows 9x 系列产品缺少重要的 Unicode 支持,而 Windows NT 和 Windows CE 系列则一开始就使用 Unicode。在这些操作系统上运行的 CLR 将Unicode 用于 String 和 Char 数据的内部表示。但也不必担心 — 当调用 Windows 9x API 函数时,CLR 会自动进行必要的转换,将其从 Unicode转换为 ANSI。如果 DLL 函数不以任何方式处理文本,则可以忽略 DllImportAttribute 的 CharSet 属性。然而,当 Char 或 String 数据是等式的一部分时,应该将 CharSet 属性设置为 CharSet.Auto。这样可以使 CLR 根据宿主 OS 使用适当的字符集。如果没有显式地设置 CharSet 属性,则其默认值为 CharSet.Ansi。这个默认值是有缺点的,因为对于在 Windows 2000、Windows XP 和 Windows NT? 上进行的 interop 调用,它会消极地影响文本参数封送处理的性能。
      

  6.   

    原来真是我引用DLL的时候没有指定charSet:
    [DllImport("winmm.dll")]
            public static extern int mciSendString(string m_strCmd, string m_strReceive, int m_v1, int m_v2);
    当我指定后:
    [DllImport("winmm.dll", CharSet = CharSet.Auto)]
            public static extern int mciSendString(string m_strCmd, string m_strReceive, int m_v1, int m_v2);
    就能够收到"status"的返回值了。
    我明白了!
    结贴吧,还是谢谢huoyingyangjie的帮助
      

  7.   

    感谢  kenken1111
    我也老是空的,搞的我好头痛啊。为了这个东西,我都好久没吃饭了,程序员就这么痛苦吗。书上又没的。什么东西都要百度,百度,百得好痛苦啊!!  [DllImport("winmm.dll",EntryPoint = "mciSendString", CharSet = CharSet.Auto)]   
            public static extern int mciSendString(string lpstrCommand, string lpstrreturnString, int uReturnLength, int hwndCallback);        public static string zhuangtai()
            {
                string durLength = "";
                mciSendString("status media position", durLength, 256, 0);
                return durLength
            }