如何通知我的应用程序默认声音播放设备已更改?

Posted

技术标签:

【中文标题】如何通知我的应用程序默认声音播放设备已更改?【英文标题】:How can I notify my application that the default sound playback device has changed? 【发布时间】:2011-08-06 06:08:36 【问题描述】:

我的 Win XP SP3 计算机上有两个声卡,我编写了一个 C++ 应用程序,通过编辑以下注册表项来更改默认播放设备:

regKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Multimedia\Sound Mapper", true);

我的应用更改了“播放”键值,以便将第一张或第二张声卡用作默认播放设备。

问题是当我更改默认设备时,应用程序仍然使用旧设备(在程序启动时设置为默认设备)。如果更改后,我再次启动应用程序,一切正常,我可以使用“新”默认播放设备。

我如何才能“告诉”我的应用程序我更改了默认设备?应用程序在启动 Windows 中默认的声音设备时通过什么方式读取和存储变量?我的问题有什么解决办法吗?

【问题讨论】:

【参考方案1】:

注册表本质上是一个存储默认设置的数据库。修改注册表中的值不会导致任何应用程序或 Windows 本身使用新的更新值重新初始化其设置。 Raymond Chen discusses this very thing with reference to user interface settings.

还要考虑到这样的事情在以后的 Windows 版本中很可能会发生变化。如果您决定更新到 Windows Vista 或 7,您将再次回到这里询问更多问题,因为您的声音切换器应用程序将不再工作。较新的版本处理音频设备的方式与 XP 中的处理方式截然不同。首先,它们现在基于Core Audio APIs。

因此,出于显而易见的原因,修改注册表值并不是修改计算机配置的首选方式。

但是,如果您只是想让特定应用程序通知您已更改注册表中的值,那么简单的解决方案是RegNotifyChangeKeyValue function。这实质上是订阅应用程序以在每次特定注册表项的值更改时接收通知。

Windows Vista 及更高版本的正确解决方案是available here。

【讨论】:

以上是关于如何通知我的应用程序默认声音播放设备已更改?的主要内容,如果未能解决你的问题,请参考以下文章

需要时通过默认通知声音播放我的声音

如何检测 UILocalnotification 声音是不是正在播放

iOS:Objective -C如何在应用程序处于后台模式时更改推送通知声音有效负载?

推送通知声音在 iOS8 上不起作用

iOS - 仅带声音的推送通知

如何在本地通知上播放不同的声音文件