'我的播放音乐的模块
'Model process sound play
Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
Private Declare Function waveOutGetNumDevs Lib "winmm.dll" () As Long
Public Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
Private 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 Declare Function mciSendCommand Lib "winmm.dll" Alias "mciSendCommandA" (ByVal wDeviceID As Long, ByVal uMessage As Long, ByVal dwParam1 As Long, ByVal dwParam2 As Any) As Long
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Private Declare Function MessageBeep Lib "user32" (ByVal wType As Long) As Long
Const SND_ASYNC = &H1
Const SND_NODEFAULT = &H2
Public PlayError As Boolean
'测试是否安装了声卡
Public Function TestSound() As Boolean
Dim Ret As Long
Ret& = waveOutGetNumDevs
If Ret > 0 Then
TestSound = True
Else
TestSound = False
End If
'TestSound = False
End Function
'播放wav声音文件
Public Sub PlaySound(FileName As String, Optional Flag As Long = (SND_ASYNC Or SND_NODEFAULT))
Dim Ret As Long
Ret = sndPlaySound(FileName, Flag)
If Ret = 0 And Flag = (SND_ASYNC Or SND_NODEFAULT) Then
MessageBeep 0
End If
End Sub
'播放音乐mp3,wav,mid等
Public Sub PlayMusic(FileName As String)
Dim Buffer As String * 128
Dim Ret As Long
Dim PlayStatus As String * 20
Dim ShortFileName As String
mciExecute "close all"
If Dir(FileName) = "" Then PlayError = True: Exit Sub
ShortFileName = ShortName(FileName)
mciSendString "open " & ShortFileName & " alias mp3", Buffer, Ret, 0
mciSendString "play mp3", Buffer, Ret, 0
PlayError = False
End Sub
Public Sub StopMusic()
Dim Buffer As String * 128
Dim Ret As Long
mciSendString "stop mp3", Buffer, Ret, 0
End Sub
Public Function GetPlayMode() As String
Dim Buffer As String * 128
Dim pos As Integer
mciSendString "status mp3 mode", Buffer, 128, 0&
pos = InStr(Buffer, Chr(0))
GetPlayMode = Left(Buffer, pos - 1)
End Function
'从带路径文件名中提取文件名
Public Function GetFileNameNoPath(sFullPathFileName As String) As String
Dim pos As Integer
Dim DifFilename As String
If sFullPathFileName = "" Then Exit Function
DifFilename = StrReverse(sFullPathFileName)
pos = InStr(1, DifFilename, "\")
If pos <> -1 Then
GetFileNameNoPath = Right(sFullPathFileName, pos - 1)
Else
GetFileNameNoPath = sFullPathFileName
End If
End Function
'得到文件短文件名
Function ShortName(LongPath As String) As String
Dim ShortPath As String
Dim pos As String
Dim Ret As Long
Const MAX_PATH = 260
If LongPath = "" Then Exit Function
ShortPath = Space$(MAX_PATH)
Ret& = GetShortPathName(LongPath, ShortPath, MAX_PATH)
If Ret& Then
pos = InStr(1, ShortPath, " ")
ShortName = Left$(ShortPath, pos - 2)
End If
End Function
利用多媒体的 mciSendString API 函数, 再搭配 mci(multimedia control interface) 指令, 即
可播放 .wav 声音档, 细节如下:
1. API 的宣告:
Declare Function mciSendString Lib "Winmm.dll" Alias "mciSendStringA"_
(ByVal Command As String,_
ByVal ReturnString As String,_
ByVal ReturnLength As Long,_
ByVal Callback As Long) As Long
Command : MCI 的命令字串
open = 开启设备:设备名 [type 设备型式][alias 别名]
close = 关闭设备:设备名
play = 播放档案:设备名 [from 起点][to 终点]
pause = 暂停档案
resume = 取消暂停档案
seek = 直接移到:设备名 [to 位置 | to start | to end]
stop = 停止拨放:设备名
Private 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 "open c:\Aria.mid alias myMIDI", vbNullString, 0, 0
mciSendString "play myMIDI", vbNullString, 0, 0
End Sub
Private Sub Command2_Click()
mciSendString "close myMIDI", vbNullString, 0, 0
End Sub
Private Sub Form_Unload(Cancel As Integer)
mciSendString "close myMIDI", vbNullString, 0, 0
End Sub