0

我正在使用 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" 时运行良好

但是,当我使用

文件名 1 = My.Application.Info.DirectoryPath & "\Correct.wav"

我没有任何声音播放。

任何人都可以帮我更正我的代码,以便它工作。先感谢您。

4

3 回答 3

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")
于 2013-05-20T13:01:27.240 回答
1

在打开文件播放之前使用 Private Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Longthen 。SetCurrentDirectory filepath这对我有用。

于 2016-10-09T13:32:13.607 回答
0

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

Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long

我刚刚在批处理midi文件读取程序中使用了mciSendString调用,打开3642个midi文件并返回版权,标题和播放时间字符串实际上很快!

最好的问候大卫 R 利奇

于 2014-01-14T17:14:57.783 回答