我在程序中使用了一个时钟控件,间隔是一秒,每隔一秒就调用mciExecute函数播放一段音乐.可是当上一段音乐还没播完时钟就开始继续执行下一条语句.请问该如何等音乐播完以后再让后面的语句执行?就象其他函数执行完以后再转交控制权.

解决方案 »

  1.   

    Function DoEvents() As Integer
        VBA.Interaction 的成员
        放弃执行,使操作系统能处理其他事件延时
    Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
      

  2.   

    最笨的办法就是得到该段音乐的文件长度(播放秒数)
    然后设置timer时间间隔。
      

  3.   

    当播放时将timer的enable 设置为Flase 播放结束时再设置为True
      

  4.   

    pcwak(书剑狂生[MS MVP]) :我想要的是使操作系统  不  能处理其它事件。bluesky23(乐天(我一直在努力)):音乐长度不定。applekiller():那样太频繁了。我举例说是一秒,其实是几十或几百毫秒。
      

  5.   

    这个函数返回值有定义吗?
    mediaplayer控件有触发事件,mciExecute函数没试过!
    要不考虑用线程!
    仅供参考
      

  6.   

    获取个音乐文件的长度
    当音乐播放时,timer.enabled=false
    否则timer.enabled=true
      

  7.   

    放音乐的时候停止TIMER 等放好了再开始
      

  8.   

    问问,online 他一定知道。
      

  9.   

    用mciSendString吧。。'模块中:
    Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
    '程序中:
    Private Sub Command1_Click()
        mciSendString "close MyWav", vbNullString, 0, 0
        mciSendString "open c:\logoff.wav alias MyWav", vbNullString, 0, 0
        mciSendString "play MyWav", vbNullString, 0, 0
        Timer1.Interval = 500
        Timer1.Enabled = True
    End Sub
    Private Sub Command2_Click()
        mciSendString "close MyWav", vbNullString, 0, 0
        Timer1.Enabled = False
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        mciSendString "close MyWav", vbNullString, 0, 0
    End SubPrivate Sub Timer1_Timer()
        Dim S As String
        S = String(256, Chr(0))
        mciSendString "status MyWav mode", S, Len(S), 0
        If Left(S, 7) = "stopped" Or Left(S, 2) = "停止" Then
          Print "播放完毕。"
          Timer1.Enabled = False
        End If
    End Sub
      

  10.   

    用这个做延时:
    startime=time
    while (time+86400-startime) mod 86400<3; doevents;wend
    500毫秒写0。5就行了
      

  11.   

    用 DoEvents 看看吧在下一条要执行的语句前写
      

  12.   

    applekiller的方法比较简单,也合理。可以用Multimedia MCI 控件播放音乐
    sub Timer1_time()
       timer1.enable=false
       mciExcute()
       
    Private Sub MMControl1_StatusUpdate()
       ’可在此事件中检查是否播放完,如果播放完了
      timer1.enable=true
    End Sub
      

  13.   

    都不行啊。首先,我不想用控件,只想用API函数来实现;第二,如果先将timer设成False,那该如何判断音乐是否播完?如果这样写:Timer1.Enabled=False
    ReturnValue = mciExecute("play " & play_WaveFile & " from 28290 to 28850")
    Timer1.Enabled=True肯定不行的,还是会不等音乐播完就执行Timer1里的语句;第三:我无法获得音乐长度,音乐的长度从10毫秒到10分钟不等;第四:使用sndPlaySound函数通过设置SND_SYNC参数到是可以实现,可是我不知道该如何使其播放指定时间段内的音乐,比如从第10秒到第30秒。
    没有人可以回答吗?
      

  14.   

    你把c:\logoff.wav改为你要播放的音乐就可以了注意如果是长文件名要先转为短文件名。
      

  15.   

    mciSendString 函数可以实现播放指定时间段内的的音乐吗?我现在没法试,不过看你的代码没看出有这个功能.
      

  16.   

    mciSendString 函数可以实现播放指定时间段内的的音乐吗?我现在没法试,不过看你的代码没看出有这个功能.
    =====================================
    "播放指定时间段内的的音乐"??????????????
    怎么要求又变了????不是太明白你的目的。
    如果要播放指定时间段内的的音乐,加个seek语句。一个简单例子:'由于wav普遍都比较短,所以换mp3。。
    '模块中:
    Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
    '程序中:
    Private Sub Command1_Click()
        mciSendString "close MyWav", vbNullString, 0, 0
        mciSendString "open e:\abc.mp3 alias MyWav", vbNullString, 0, 0
        mciSendString "seek mywav to 20000", vbNullString, 0, 0
        mciSendString "play MyWav", vbNullString, 0, 0
        Timer1.Interval = 500
        Timer1.Enabled = True
    End Sub
    Private Sub Command2_Click()
        mciSendString "close MyWav", vbNullString, 0, 0
        Timer1.Enabled = False
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        mciSendString "close MyWav", vbNullString, 0, 0
    End SubPrivate Sub Timer1_Timer()
        Dim S As String
        S = String(256, Chr(0))
        mciSendString "status MyWav mode", S, Len(S), 0
        If Left(S, 7) = "stopped" Or Left(S, 2) = "停止" Then
          Print "播放完毕。"
          Timer1.Enabled = False
         Else
          mciSendString "status MyWav position", S, Len(S), 0
          Label1.Caption = S
        End If
    End Sub上面的例子是从20秒的地方开始播放abc.mp3,直到结束,打印“播放完毕。"
    如果想"播放指定时间段内的的音乐”,只需要根据
    mciSendString "status MyWav position", S, Len(S), 0
    的返回值跳回到你想开始播放的位置再从新播放就行了
    留意一下label显示的值与时间的关系
      

  17.   

    第四:使用sndPlaySound函数通过设置SND_SYNC参数到是可以实现,可是我不知道该如何使其播放指定时间段内的音乐,比如从第10秒到第30秒。============================================我最初的意思就是调用mciExecute函数播放一段音乐,要求一点也没变。我的电脑坏了,所以没法测试楼上的代码。不过总感觉和我想要的不太一样。算了,自己想办法了。
      

  18.   

    第四:使用sndPlaySound函数通过设置SND_SYNC参数到是可以实现,可是我不知道该如何使其播放指定时间段内的音乐,比如从第10秒到第30秒。
    ===================================================
    在我的记忆中,sndPlaySound函数对所播放的音乐的大小是有限制的,只能用来播放一些比较短的音效,而你说的要求“比如从第10秒到第30秒”这么大的文件,恐怕不能用sndPlaySound函数还是sndPlaySound出了新版本????????其实要达到你的要求并不难,我上面已经说了:
    “如果想"播放指定时间段内的的音乐”,只需要根据
    mciSendString "status MyWav position", S, Len(S), 0
    的返回值跳回到你想开始播放的位置再从新播放就行了”'一个例子:
    '反复播放一段音乐的第10秒到第30秒
    '模块中:
    Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long'程序中:
    Private Sub Command1_Click()
        mciSendString "close MyWav", vbNullString, 0, 0
        mciSendString "open e:\abc.mp3 alias MyWav", vbNullString, 0, 0
        mciSendString "seek mywav to 10000", vbNullString, 0, 0
        mciSendString "play MyWav", vbNullString, 0, 0
        Timer1.Interval = 500
        Timer1.Enabled = True
    End Sub
    Private Sub Command2_Click()
        mciSendString "close MyWav", vbNullString, 0, 0
        Timer1.Enabled = False
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        mciSendString "close MyWav", vbNullString, 0, 0
    End SubPrivate Sub Timer1_Timer()
        Dim S As String
        S = String(256, Chr(0))
        mciSendString "status MyWav position", S, Len(S), 0
        If Val(S) >= 30000 Then
         mciSendString "seek mywav to 10000", vbNullString, 0, 0
         mciSendString "play MyWav", vbNullString, 0, 0
        End If
         Label1.Caption = S
    End Sub
      

  19.   

    可是我  不知道   该如何使其播放指定时间段内的音乐,比如从第10秒到第30秒。
    =============================================
    而你说的要求“比如从第10秒到第30秒”这么大的文件,恐怕不能用sndPlaySound函数还是sndPlaySound出了新版本????????
    =============================================
    -_-|||