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

标签 c++ windows windows-xp registry soundcard

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

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

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

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

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

最佳答案

注册表本质上是一个存储默认设置的数据库。修改注册表中的值不会导致任何应用程序或 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 .

关于c++ - 如何通知我的应用程序默认的声音播放设备已更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5675786/

相关文章:

c# - 图像到图标的转换

c++ - 在同一个进程中加载​​同一个 DLL 的 2 个版本

c++ - C++中对数组的误解

c++ - Divide et impera sum of the elements of an array 错误

windows - WinAPI 文档在哪里?

windows - 如何使用PowerShell和Windows 10打开/关闭WiFi状态?

.net - 如何安装同一个windows服务的多个实例

c++ - CUDA 链接错误 - Visual Express 2008 - 由于(空)配置文件导致 nvcc 致命

c++ - GCC 遗漏了一些错误或警告

c++ - 我如何让 Xcode Instruments 将未分配的内存报告为泄漏?