【问题标题】:How to play non default system sounds in .NET如何在 .NET 中播放非默认系统声音
【发布时间】:2026-02-22 12:35:01
【问题描述】:

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

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

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

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

当然玩也没有问题,因为我可以使用:

My.Computer.Audio.Play(strWAVFile)

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

【问题讨论】:

  • 也许我误读了这个问题,但您似乎在问“当用户没有为该事件选择任何声音时,如何播放用户为该事件选择的声音? "
  • @Andrew 我想查找是否已将声音分配给控制面板声音中的“菜单弹出”操作。如果声音被分配,那么我想找到与此操作关联的 WAV 文件的路径。
  • 明白了!我认为 Alex Essilfie 下面的答案就是您所寻求的。

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


【解决方案1】:

系统事件的波形声音文件存储在系统注册表中,它们自 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 变量是否为空,因为并非每个事件都可能有与之关联的声音,并且您不希望应用程序因为找不到声音文件而停止工作。

【讨论】:

  • 这不是我希望的,因为我认为可能存在托管代码解决方案,但这绝对是一个可行的解决方案。
  • @Matt:由于程序可以将自己的条目添加到声音方案中,因此将整个操作包装在托管代码中的任何尝试都可能不可行。
【解决方案2】:

假设 windows 默认媒体文件夹在 C\Windows\Media

您可以简单地播放 Windows 默认自带的任何声音。

 My.Computer.Audio.Play("c:\windows\media\alarm01.wav", AudioPlayMode.Background)

安装全新的 Windows 并打开 Media 文件夹。

编码时注意目标窗口的兼容性。

【讨论】: