http://expert.csdn.net/Expert/TopicView1.asp?id=1705200有我的部分公用类,其中有个播放声音类就有SND_PURGE 的定义和用法示例(在how use this? 的region 段)

解决方案 »

  1.   

    谢谢,我加乐0x40(SND_PURGE = 0x40)以后,怎么还是没有办法终止正在播放的声音文件阿?是不是我的用法不正确?
    PlaySound("welcome.wav",0,0x40 | 0x00040004);
      

  2.   

    我现在的用法是PlaySound("welcome.wav",IntPtr.Zero,0x40 );
    然后在button_click()里面加入PlaySound(null, IntPtr.Zero, 0);但是我发现程序总是在
    PlaySound("welcome.wav",IntPtr.Zero,0x40 );执行完以后才开始运行button_click(),所以PlaySound(null, IntPtr.Zero, 0);这个终止声音文件播放函数也起不了作用,应该如何让PlaySound运行是来响应我的其他函数阿?谢谢!!!
      

  3.   

    简单的说要中止可以用:byte[] mySound = new System.Byte[]{0};
    PlaySound(ref mySound,IntPtr.Zero,0x40|0x04|0x02);其中的0x40 就是SND_PURGE 指示用于中止
    0x04 是指SND_MEMORY 播放内容中的声音byte 流
    0x02 指SND_NODEFAULT 如果该byte 流不可用或其它原因造成源错误时不播放默认声音警告
      

  4.   

    0x04 是指SND_MEMORY 播放内容中的声音byte 流中的内容应为内存
      

  5.   

    上例少写了个字,应为byte[] mySound = new System.Byte[]{0};
    PlaySound(ref mySound[0],IntPtr.Zero,0x40|0x04|0x02);为此我特意写了个程序给你参考,如下的控制台程序,可编译参考:using System;
    using System.Threading;
    using System.Runtime.InteropServices;namespace soundtst
    {
    public class sndPlay { [DllImport("winmm.dll", EntryPoint="PlaySound")]
    public static extern bool PlaySound(ref Byte snd, IntPtr hmod, uint fdwSound);

    [DllImport("winmm.dll", EntryPoint="PlaySound")]
    public static extern int PlaySound(string  lpszName,int hModule,int dwFlags); public enum PlayingFlags :uint {
    SND_SYNC = 0x00,
    SND_ASYNC = 0x01,
    SND_NODEFAULT = 0x02,
    SND_MEMORY = 0x04,
    SND_ALIAS = 0x010000,
    SND_FILENAME = 0x020000,
    SND_RESOURCE = 0x040004,
    SND_ALIAS_ID = 0x0110000,
    SND_ALIAS_START = 0,
    SND_LOOP = 0x08,
    SND_NOSTOP = 0x010,
    SND_VALID = 0x01F,
    SND_NOWAIT = 0x02000,
    SND_PURGE = 0x40
    }
    } class Class1
    {
    [STAThread]
    static void Main(string[] args)
    {
    Console.WriteLine("now Start Play");
    sndPlay.PlaySound(
    @"Welcome.wav", /*文件名自己改*/
    0,
    (int)sndPlay.PlayingFlags.SND_ASYNC | (int)sndPlay.PlayingFlags.SND_LOOP
    ); Console.WriteLine("now Sleep 5 sec");
    Thread.Sleep(5 * 1000); Console.WriteLine("now stop it");
    byte[] mySound = new System.Byte[]{0};
    sndPlay.PlaySound(ref mySound[0],IntPtr.Zero,0x40|0x04|0x02); Console.WriteLine("wait 5 sec to END");
    Thread.Sleep(5 * 1000);
    }
    }
    }
      

  6.   

    倒,差点误人子弟,没注意是用文件播放,那你直接用:sndPlay.PlaySound(null,0,0x40|0x04|0x02);就可以立即中止,就是说不要指定文件名并用上40 是可以直接中止的差点误人子弟,希望你结帐后能再见到此回复。
      

  7.   

    1)也就是说(直接文件播放)public static extern int PlaySound(string  lpszName,int hModule,int dwFlags);声明的话,可以直接用sndPlay.PlaySound(null,0,0x40|0x04|0x02);来中止2)如果是(用于已载入内存的声间,比如从资源文件获取)public static extern bool PlaySound(ref Byte snd, IntPtr hmod, uint fdwSound);声明的话就用:byte[] mySound = new System.Byte[]{0};
    sndPlay.PlaySound(ref mySound[0],IntPtr.Zero,0x40|0x04|0x02);来中止总之,不管哪种声明,付源为空值,然后标志上使用 0x40 就可以了,如果不使用也可以中止,但是不会消毁资源并关闭文件关联。
      

  8.   

    呵呵,谢谢!我现在可以实现播放的终止了,不过又遇到的一个新问题就是:
    不能实现声音文件的连读,比如:
    for(schoolinfNum=0;school[0+schoolinfNum]!=null;schoolinfNum++)
    {
        sndPlay.PlaySound(school[0+schoolinfNum],0,
                           (int)sndPlay.PlayingFlags.SND_ASYNC);       
    }
    sndPlay.PlaySound(1schoolinf.wav,0,
                           (int)sndPlay.PlayingFlags.SND_ASYNC);
    school[]为string类型的数组,存放的是声音文件名,它就只会读最后一条“1schoolinf.wav”。而前面的因为playsound一运行就返回所以全部被pass了,因为我想实现的是如果用户按键的话就终止播放,如果没有按键的话就连续播放数组中存放所有声音文件这可以怎么实现阿?
      

  9.   

    将 SND_ASYNC 改成 SND_SYNC这样的话是指同步播放,那么就会播放完第一个才会再播放下一个
    但同时造成的问题是程序被挂起直到播放完成
    所以我建议你开一个新线程来跑播放声音,那样就不影响主线程,从而两全其美
      

  10.   

    这个问题我都已经结帖了,而且100都已经送给ArLi2003(阿利 无业悠民)大虾了,怎么每次来还没有见它说结帖,ArLi2003(阿利 无业悠民)的得分也总是0阿?
    呵呵。不好意思,第一次提问题了
      

  11.   

    可能是你提交成为FAQ了如果提交要等版主批好象,你应该在结帐时提示FAQ 时按取消具体我也不太清楚我也刚来没多久。。分数不重要,交流重要的多,人比数字重要的多