vb.net是否有一种简单的方法可以为按钮点击添加声音

时间:2012-03-21 23:26:41

标签: .net vb.net

有一种简单的方法吗

我在网上发现了这个错误

 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签名的调用约定和参数是否与目标非托管签名匹配。

3 个答案:

答案 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>