Sub PlayWaveSound(fn$)
sndPlaySound 0&, SND_ASYNC ‘stop sound
DoEvents
sndPlaySound fn$, SND_ASYNC Or SND_NODEFAULT 'playsound
DoEvents
End Sub上面的代码有时不能停止正在播放的声音,为什么?
sndPlaySound 0&, SND_ASYNC ‘stop sound
DoEvents
sndPlaySound fn$, SND_ASYNC Or SND_NODEFAULT 'playsound
DoEvents
End Sub上面的代码有时不能停止正在播放的声音,为什么?
Private Declare Function sndStopSound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszNull As Long, ByVal uFlags As Long) As LongPrivate Declare Function midiOutClose Lib "winmm.dll" (ByVal hMidiOut As Long) As Long
Private Declare Function midiOutOpen Lib "winmm.dll" (lphMidiOut As Long, ByVal uDeviceID As Long, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As Long
Private Declare Function midiOutShortMsg Lib "winmm.dll" (ByVal hMidiOut As Long, ByVal dwMsg As Long) As Long
Private Const SND_MEMORY = &H4
Private Const SND_SYNC = &H0
Private Const SND_ASYNC = &H1
Private Const SND_NODEFAULT = &H2
Private Const SND_LOOP = &H8
Private Const SND_NOSTOP = &H10Dim hMidiOut As Long
Dim aWave() As Byte
Dim aMidi() As Byte
Private Function PlayWave() As Boolean
Dim r As Long
Dim uFlags As Long
uFlags = SND_ASYNC Or SND_NODEFAULT Or SND_MEMORY Or SND_LOOP
r = sndStopSound(0, SND_ASYNC)
r = sndPlaySound(aWave(0), uFlags)
End Function
我这样写的,可以停止播放
参考一下
SND_ALIAS pszSound参数指定了注册表或WIN.INI中的系统事件的别名。
SND_ALIAS_ID pszSound参数指定了预定义的声音标识符。
SND_ASYNC 用异步方式播放声音,PlaySound函数在开始播放后立即返回。
SND_FILENAME pszSound参数指定了WAVE文件名。
SND_LOOP 重复播放声音,必须与SND_ASYNC标志一块使用。
SND_MEMORY 播放载入到内存中的声音,此时pszSound是指向声音数据的指针。
SND_NODEFAULT 不播放缺省声音,若无此标志,则PlaySound在没找到声音时会播放缺省声音。
SND_NOSTOP PlaySound不打断原来的声音播出并立即返回FALSE。
SND_NOWAIT 如果驱动程序正忙则函数就不播放声音并立即返回。
SND_PURGE 停止所有与调用任务有关的声音。若参数pszSound为NULL,就停止所有的声音,否则,停止pszSound指定的声音。
SND_RESOURCE pszSound参数是WAVE资源的标识符,这时要用到hmod参数。
SND_SYNC 同步播放声音,在播放完后PlaySound函数才返回。 要停止当前声音 用 sndPlaySound "",SND_ASYNC 应该ok了 .