.net - 如何在 .NET 中播放非默认系统声音

标签 .net vb.net visual-studio-2010 user-experience audio

我想在我的应用程序中使用 .NET 代码播放系统声音 - 如果我想使用 Beep 没问题, Asterisk等等,因为我可以使用:

My.Computer.Audio.PlaySystemSound(Media.SystemSounds.Asterisk)

但是如果我想播放“菜单弹出”之类的东西怎么办?默认情况下,此声音在 Windows 默认声音方案中是关闭的,但如果用户已将此声音设置为执行某些操作,那么我想播放它。

用户可以将任何 wav 文件分配给这个 Action ,所以我想找到他们分配的声音(如果有的话)并播放它。与回到 XP 的 Windows 版本的兼容性也很重要。

播放它当然也没有问题,因为我可以使用:
My.Computer.Audio.Play(strWAVFile)

所以问题实际上是关于如何找到它。

最佳答案

系统事件的波形声音文件存储在系统注册表中,它们自 Windows 95 以来就一直存在,因此兼容性不是问题。

检查此注册表项是否为事件播放的声音:

HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default



对于您所说的“菜单弹出”,您可以从此注册表项中读取默认值:

HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default\MenuPopup\.Current



所以你会写这样的代码:
Dim rk = Registry.CurrentUser.OpenSubKey("AppEvents\Schemes\Apps\.Default\" & _
                                         "MenuPopup\.Current")
Dim soundFile = rk.GetValue("")

If soundFile <> "" Then 
    My.Computer.Audio.Play(soundFile)
End If

我检查了 soundFile变量在播放之前为空,因为并非每个事件都可能有与之关联的声音,并且您不希望应用程序因为找不到声音文件而停止工作。

关于.net - 如何在 .NET 中播放非默认系统声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5975747/

相关文章:

c# - Monitor.TryEnter/Monitor.Exit 和 SynchronizationLockException

.net - 使用 SpecFlow、White、Spring 和 MS Test 测试 WinForms/CompositeUI GUI

vb.net - 设置列表框的默认选择?

vb.net - 为用户错误抛出异常?或者更好地设计自定义错误消息框架?

mysql - 在MySQL中加载数据的函数

c# - 在 x86 中编译引用 C++/CLI DLL 的 C# 项目时,MSBuild 无法生成

c# - VS2010如何抑制MSB3245(引用的组件X不存在)

c# - 如何避免为实现相同接口(interface)的类编写重复的单元测试?

c# - 需要一个 C# 函数来在 .NET CF 中获取 SDCard 序列号

.net - 使用流的简单问题