VB.NET在XP系统下如何发出系统蜂鸣声?

5

是否有可能让vb.net程序发出PC的内部扬声器声音?你知道那个产生C语言 \a 响铃声的扬声器吗? 我尝试过使用beep(),但这只会在声卡上产生错误声音。 我也尝试过

<Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint:="Beep", SetLastError:=True, _
CharSet:=Runtime.InteropServices.CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=Runtime.InteropServices.CallingConvention.StdCall)> _
Public Shared Function _
   aBeep(ByVal dwFreq As Integer, ByVal dwDuration As Integer) _
     As Boolean
End Function

看起来这个功能似乎只在Vista及以上版本中有效。有什么建议吗?


1
你知道并非所有的电脑都像你所描述的那样拥有内置硬件扬声器,对吧?因此,在许多情况下,特别是在企业环境中发现的廉价机器上,这个程序可能不会按预期执行。 - Cody Gray
1
还有,这是64位的Windows XP吗?因为我上次使用XP已经很久了,Beep函数会从内部系统扬声器发出蜂鸣声,就像你描述的那样。这与MessageBeep函数形成对比,后者会在连接时从声卡发出蜂鸣声。64位版本的XP和Windows Vista是首批打破这种行为的操作系统。 - Cody Gray
该死,我正在使用64位版本...看来我的用户只能戴上耳机了... - Toby
1个回答

3
使用VB.NET中的My命名空间,您可以通过My.Computer.Audio访问音频。它有一个Play方法,其中包含许多重载,允许您通过文件位置或作为字节数组或流传递.wav声音,但它还有一个PlaySystemSound方法,它需要一个枚举,其中之一是Beep。因此,播放此声音的完整行是:
My.Computer.Audio.PlaySystemSound(Media.SystemSounds.Beep)

不能保证,但由于它是.NET框架的一部分,我认为这应该可以在XP和Vista上工作...


这只会通过声卡发出警告信息“doop”,不过还是谢谢。 - Toby
我手边没有Reflector的副本,但是我愿意打赌该函数只是将Win32的“Beep”函数包装起来。正如我们已经讨论过的那样,“Beep”函数在64位版本的Windows XP上不起作用。另请参阅:http://blogs.msdn.com/b/larryosterman/archive/2010/01/04/what-s-up-with-the-beep-driver-in-windows-7.aspx - Cody Gray
@CodyGray 它调用了 user32.dll 中的 MessageBeep 函数。 - PhilPursglove
啊,是的。按照这里所述将参数映射为0xFFFFFFFF。这将执行与Beep相同的操作。MessageBeep函数只是该函数的扩展版本。不幸的是,这也证实了它不起作用。 :-) - Cody Gray
为了让事情变得更加复杂,我今天建立了一个64位XP Pro虚拟机来尝试这个问题。如果Beep在64位上不支持,我预计它会抛出PlatformNotSupportedException异常,但是它却可以工作,正如@Toby所说,通过声卡实现。 - PhilPursglove
那不应该让事情变得混乱。这正是它应该做的。 - Cody Gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接