mciSendString / winmm.dll - 播放音频文件

时间:2013-05-20 12:14:12

标签: vb.net visual-studio-2008 audio

我正在使用Visual Basic 2008中的程序,我需要具有不同音量的不同类型的声音。因此,My.Computer.Audio.Play不是一个有效的选项。

我决定改用mciSendString,找到以下代码

Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
ByVal uReturnLength As Integer, ByVal hwndCallback As Integer) As Integer

    mciSendString("close myWAV", Nothing, 0, 0)
    Dim fileName1 As String = 
    mciSendString("open " & fileName1 & " type mpegvideo alias myWAV", Nothing, 0, 0)
    mciSendString("play myWAV", Nothing, 0, 0)

    'min Volume is 1, max Volume is 1000
    Dim Volume As Integer = (SFXVolume * 100)
    mciSendString("setaudio myWAV volume to " & Volume, Nothing, 0, 0)

现在这个代码我已经测试过,并且在filename1 =“C://Correct.wav”

时工作正常

但是当我使用

filename1 = My.Application.Info.DirectoryPath& “\ Correct.wav”

我没有任何声音播放。

有人可以帮我纠正我的代码,以便这样做。 提前谢谢。

3 个答案:

答案 0 :(得分:1)

如果您的DirectoryPath有空格,那么mciSendString将无法准确识别该命令,您需要用引号括住该路径:

mciSendString(
    String.Format("open ""{0}"" type mpegvideo alias myWAV", fileName1), Nothing, 0, 0)

一定要检查返回状态,正如汉斯建议的那样。

此外,由于您不知道DirectoryPath是否有反斜杠,因此从目录和名称生成完整路径的准确方法是:

fileName1 = System.IO.Path.Combine(My.Application.Info.DirectoryPath, "Correct.wav")

答案 1 :(得分:1)

在打开文件进行播放之前,请先使用Private Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long然后SetCurrentDirectory filepath。这对我有用。

答案 2 :(得分:0)

您需要使用DLL调用GetShortPathName才能将文件路径传递给WINMM.DLL。 lpszLongPath是您的完整路径字符串,短路径名将传递给lpszShortPath。 cchbuffer应该设置为200左右,但在大多数情况下,返回的字符串会短得多。你应该使用VB填充字符串。

私有声明函数GetShortPathName Lib“kernel32”别名“GetShortPathNameA”(ByVal lpszLongPath As String,ByVal lpszShortPath As String,ByVal cchBuffer As Long)

我刚刚在批量midi文件阅读程序中使用了mciSendString调用,打开了3642个midi文件,并且很快就返回了版权,标题和播放持续时间字符串!

最诚挚的问候 David R Leach