我正在使用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”
我没有任何声音播放。
有人可以帮我纠正我的代码,以便这样做。 提前谢谢。
答案 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