你所要求的在 XP 上是不可能的;操作系统根本不支持每个应用程序的音量级别。
您可以通过创建一个设置类来保留类似SoundActive: Boolean
或PlaySounds: Boolean
类似的东西来完成您想要的事情。将它放在它自己的单元中,并有一个创建它的实例的初始化部分和一个释放它的终结部分(使其有效地成为全局值的集合)。
每个需要访问这些设置的单元只需使用包含它们的单元,并相应地调整行为。因此,您的每个子类或表单或任何只需要添加检查的东西:
if CurrentSettings.PlaySounds then
// Code that makes sounds, plays music, whatever.
设置类还可以包含跟踪当前音量级别的方法(在 XP 上,系统范围级别),以及使用MMSystem
音量函数增加或减少音量的方法(这里有很多例子,通过谷歌这样做)。然后,您的应用可以使用OnActivate
和OnDeactivate
事件在您的应用获得焦点时设置音量级别,并在您的应用失去焦点时将其恢复到适当的音量。
在 Vista 及更高版本中,您可以使用IAudioEndPointVolume
我前面提到的界面和控制系统范围音量的方法GetMasterVolumeLevel
或SetMasterVolumeLevel
方法(我有一个这样做的示例,以及适当的MMDevAPI
接口定义)或设备级音量(IMMDevioce.Activate
用于选择合适的设备先然后上面的IAudioEndPointVolume
方法在设备接口上从参数IMMDevice.Activate
中接收ppInterface
)。
对于单个应用程序,您可以使用该ISimpleAudioVolume
接口,该接口有四种方法:GetMasterVolume
和SetMasterVolume
,用于控制应用程序音频会话的音量,以及GetMute
允许SetMute
您检索当前静音标志值或分别设置它。(MS 的 Larry Osterman 是开发 Vista 和 Win7 中新音频支持的开发人员之一,在他的博客上有一篇很好的起点文章,介绍了新 API 中的音频类型以及何时使用它们。 )
从概念上讲,可以在运行时确定您正在使用哪个操作系统,并以编程方式在使用MMSystem
XP 和更早版本的MMDevAPI
功能与 Vista 和更高版本的功能之间切换。然而,期望有人在这里提供这样做的代码有点不合理。我提供的链接应该让您开始走上正确的道路,当您遇到障碍时,解决这些障碍的具体帮助将是很好的问题。