有一种简单的方法吗
我在网上发现了这个错误
Declare Function apisndPlaySound Lib "winmm" Alias "sndPlaySoundA" _
(ByVal filename As String, ByVal snd_async As Long) As Long
Function PlaySound(ByVal sWavFile As String)
' Purpose: Plays a sound.
' Argument: the full path and file name.
If apisndPlaySound(sWavFile, 1) = 0 Then
MsgBox("The Sound Did Not Play!")
End If
End Function
对PInvoke函数'WindowsApplication3!WindowsApplication3.Module1 :: apisndPlaySound'的调用使堆栈失衡。这很可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。
答案 0 :(得分:1)
使用SoundPlayer类,您可以在VB.net中使用My关键字访问它:
My.Computer.Audio.Play(location)
但是,如果单击按钮,则每次用户单击按钮时,您将获得读取* .wav文件的性能瓶颈(通过最大化IO)。在这种情况下,我建议使用:
Beep()
另外作为一般的经验法则,KISS首先通过调查/研究.Net框架中的方法,然后再使用Win32 API。 HTH
答案 1 :(得分:0)
我在winnm.dll中发现了一个完全不同的PlaySound签名 根据{{3}},您应该声明
<DllImport("winmm.dll")> _
Shared Function PlaySound( _
ByVal szSound As String, _
ByVal hModule As UIntPtr, _
ByVal fdwSound As Integer) As Integer
End Function
并致电:
PlaySound(sWavFile, IntPtr.Zero, SoundFlags.SND_FILENAME Or SoundFlags.SND_ASYNC)
其中
SoundFlags.SND_FILENAME = &H20000
SoundFlags.SND_ASYNC = &H1
答案 2 :(得分:0)
According to MSDN,签名需要(无符号)Integer
,而不是Long
;返回值相同。您找到的示例代码可能是针对VB6的。
Declare Function apisndPlaySound Lib "winmm" Alias "sndPlaySoundA" _
(ByVal filename As String, ByVal snd_async As UInteger) As Integer
...或者您使用Steve找到的PlaySound
函数,因为sndPlaySound
仅用于向后兼容性。更好的是,使用Jeremy展示的内置功能。</ p>