2011-05-12 26 views
3

我想玩系统在我的应用程序.NET代码的声音 - 没有问题,如果我想使用BeepAsterisk等,我可以只使用:如何发挥非默认的系统声音在.NET

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

但是如果我想玩'菜单弹出'这样的东西呢? Windows默认声音方案中默认关闭此声音,但如果用户已将此声音设置为执行某些操作,则我想播放它。

用户可能已将任何wav文件分配给此操作,因此我想要查找分配给他们的音乐(如果有)。 Windows版本与XP的兼容性也很重要。

播放它,当然是没有问题,无论是作为我可以使用:

My.Computer.Audio.Play(strWAVFile) 

所以真正的问题是如何找到它。

+0

也许我错误地理解了这个问题,但是您似乎在问“如何在用户没有为该事件选择任何声音时播放用户为特定事件选择的声音?” – 2011-05-12 10:28:57

+0

@Andrew我想知道是否有声音被分配到控制面板声音中的“菜单弹出菜单”中。如果已经分配了声音*,我希望找到与此操作关联的WAV文件的路径。 – 2011-05-12 10:35:31

+0

嘿!我认为Alex Essilfie的回答如下是你所寻求的。 – 2011-05-12 13:49:27

回答

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变量打它,因为并不是每一个事件可能有关联的声音之前是空的,你不希望你的应用程序停止运行因为无法找到声音文件。

+0

这不完全是我希望*因为我认为可能有一个托管代码解决方案,但这绝对是一个可行的解决方案。 – 2011-05-12 14:48:43

+1

@Matt:由于程序可以将它们自己的条目添加到声音方案中,因此任何试图将整个操作包装在托管代码中的尝试可能都不可行。 – 2011-05-12 14:57:44

0

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

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

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

有一个新的Windows安装和打开媒体文件夹。

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