6

我有一个有声音的应用程序。我有一个全局属性来静音。问题是,有很多不同的东西可以发出声音,我不想遍历不同的类类型并将它们的声音静音/取消静音。相反,我正在寻找一种在全局应用程序级别上静音的方法。我也不是说要使整个系统音量静音。

一种情况:在 Windows 7 中,您可以打开音量混合器并调整各个应用程序的音量。虽然我不打算更改这个实际的特定值(因为我知道它是特定于 Windows 7 的),但我想一次更改我的应用程序中所有内容的音量。我还需要能够完全静音应用程序中所有内容的声音。我需要这种能力才能与 Windows XP 及更高版本兼容。我假设它将涉及 Windows API 调用,但我不知道要进行什么调用。

4

2 回答 2

4

XP 不支持按应用程序进行音量控制。该功能是在 Vista 中添加的。因此,您尝试做的事情不能在 XP 中以公平的方式完成。

有一个名为IndieVolume的软件,它可以复古地将每个应用的音量控制适应 XP。我只能想象它是通过低级黑客攻击、DLL 注入等方式实现的。我怀疑这对你来说真的是一个选择。

于 2012-08-26T08:40:21.883 回答
3

你所要求的在 XP 上是不可能的;操作系统根本不支持每个应用程序的音量级别。

您可以通过创建一个设置类来保留类似SoundActive: BooleanPlaySounds: Boolean类似的东西来完成您想要的事情。将它放在它自己的单元中,并有一个创建它的实例的初始化部分和一个释放它的终结部分(使其有效地成为全局值的集合)。

每个需要访问这些设置的单元只需使用包含它们的单元,并相应地调整行为。因此,您的每个子类或表单或任何只需要添加检查的东西:

if CurrentSettings.PlaySounds then
  // Code that makes sounds, plays music, whatever.

设置类还可以包含跟踪当前音量级别的方法(在 XP 上,系统范围级别),以及使用MMSystem音量函数增加或减少音量的方法(这里有很多例子,通过谷歌这样做)。然后,您的应用可以使用OnActivateOnDeactivate事件在您的应用获得焦点时设置音量级别,并在您的应用失去焦点时将其恢复到适当的音量。

在 Vista 及更高版本中,您可以使用IAudioEndPointVolume我前面提到的界面和控制系统范围音量的方法GetMasterVolumeLevelSetMasterVolumeLevel方法(我有一个这样做的示例,以及适当的MMDevAPI接口定义)或设备级音量(IMMDevioce.Activate用于选择合适的设备先然后上面的IAudioEndPointVolume方法在设备接口上从参数IMMDevice.Activate中接收ppInterface)。

对于单个应用程序,您可以使用该ISimpleAudioVolume接口,该接口有四种方法:GetMasterVolumeSetMasterVolume,用于控制应用程序音频会话的音量,以及GetMute允许SetMute您检索当前静音标志值或分别设置它。(MS 的 Larry Osterman 是开发 Vista 和 Win7 中新音频支持的开发人员之一,在他的博客上有一篇很好的起点文章,介绍了新 API 中的音频类型以及何时使用它们。 )

从概念上讲,可以在运行时确定您正在使用哪个操作系统,并以编程方式在使用MMSystemXP 和更早版本的MMDevAPI功能与 Vista 和更高版本的功能之间切换。然而,期望有人在这里提供这样做的代码有点不合理。我提供的链接应该让您开始走上正确的道路,当您遇到障碍时,解决这些障碍的具体帮助将是很好的问题。

于 2012-11-02T13:01:24.450 回答