如何播放资源中的声音文件  在线等

解决方案 »

  1.   

    Dim sndPing as new SoundPlayer(SoundRes.GetType(), "Ping.wav")
        sndPing.Play()
      Public   Declare   Function   PlaySound   Lib   "winmm.dll"   Alias   "PlaySoundA"   (ByVal   lpszName   As   String,   ByVal   hModule   As   Long,   ByVal   dwFlags   As   Long)   As   Long   
        
      调用方式:   
              Public   Const   SND_FILENAME   =   &H20000           '     name   is   a   file   name   
              Public   Const   SND_ASYNC   =   &H1                   '     play   asynchronously   
        
              Dim   szFileName   As   String   
              szFileName   =   App.Path   &   "\test.wav"     
              PlaySound   szFileName,   0,   SND_FILENAME   +   SND_ASYNC  
      

  2.   

    嘿,楼上的代码的确可以播放声音,不过人家要播放资源文件里的声音,那就要先读资源文件,再保存文件,最后播放~这样程序就多了些“垃圾”出来了!同样一个API函数,改一下参数让它播放内存中的声音:Private Const SND_MEMORY = &H4
    Private Const SND_ASYNC = &H1Private Declare Function sndPlaySoundFormMemory Lib "winmm.dll" Alias "sndPlaySoundA" (lpszSoundName As Any, ByVal uFlags As Long) As Long '这个API和楼上的API是一样的,只是我把函数名和参数名改了Private Sub Form_Load()
    Dim byteSound() As Byte
    byteSound = LoadResData(声音ID, 声音类型)
    sndPlaySoundFormMemory byteSound(0), SND_MEMORY Or SND_ASYNC 
    End Sub
    上面这些代码,只适合与声音文件保存在你的程序文件的资源中!
    如果是其他的资源DLL或者程序,那代码比较复杂点,不过还是可以的:Private Const LOAD_LIBRARY_AS_DATAFILE = &H2Private Declare Function LoadLibraryEx Lib "kernel32" Alias "LoadLibraryExA" (ByVal lpLibFileName As String, ByVal hFile As Long, ByVal dwFlags As Long) As Long
    Private Declare Function FindResource Lib "kernel32" Alias "FindResourceA" (ByVal hInstance As Long, ByVal lpName As String, ByVal lpType As String) As Long
    Private Declare Function LoadResource Lib "kernel32" Alias "LoadResource" (ByVal hInstance As Long, ByVal hResInfo As Long) As Long
    Private Declare Function LockResource Lib "kernel32" Alias "LockResource" (ByVal hResData As Long) As Long
    Private Declare Function sndPlaySoundFormMemory Lib "winmm.dll" Alias "sndPlaySoundA" (lpszSoundName As Any, ByVal uFlags As Long) As Long
    Private Declare Function FreeLibrary Lib "kernel32" Alias "FreeLibrary" (ByVal hLibModule As Long) As LongPrivate Sub Form_Load()
        Dim hInst As Long
        Dim hFindRes As Long
        Dim hRes As Long
        Dim hResFirstByte As Long    hInst = LoadLibraryEx(资源文件路径与名称, 0, LOAD_LIBRARY_AS_DATAFILE)
        If hInst Then
            hFindRes = FindResource(hInst, 资源ID, 资源类型)
            If hFindRes Then
                hRes = LoadResource(hInst, hFindRes)
                If hRes Then
                    hResFirstByte = LockResource(hRes)
                    sndPlaySoundFormMemory ByVal hResFirstByte, SND_MEMORY Or SND_ASYNC
                End If
            End If
            FreeLibrary hInst
        End If
    End Sub
    我用来读系统文件(Shell32.dll)里面的资源就是用类似这样的代码,不过声音的话我没试过,这是我根据我读AVI资源的代码来改的,希望对你有用
      

  3.   


    Private Const SND_MEMORY = &H4 
    Private Const SND_ASYNC = &H1 Private Declare Function sndPlaySoundFormMemory Lib "winmm.dll" Alias "sndPlaySoundA" (lpszSoundName As Any, ByVal uFlags As Long) As Long '这个API和楼上的API是一样的,只是我把函数名和参数名改了 Private Sub Form_Load() 
        Dim byteSound() As Byte 
        byteSound = LoadResData(声音ID, 声音类型) 
        sndPlaySoundFormMemory byteSound(0), SND_MEMORY Or SND_ASYNC   
    End Sub