如何静音我的应用程序的声音?

时间:2012-08-25 22:53:54

标签: delphi audio delphi-xe2 volume

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

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

2 个答案:

答案 0 :(得分:4)

XP不支持每个应用程序的音量控制。 Vista中添加了这项功能。所以你试图做的事情不能通过公平的方式在XP中完成。

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

答案 1 :(得分: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,用于控制应用程序音频会话的音量级别,以及{{1} }和GetMute允许您分别检索当前静音标志值或设置它。 (MS的Larry Osterman是Vista和Win7中新的音频支持开发人员之一,他的博客上有一个很棒的starting point article关于新API中的音频类型以及何时使用每个它们。)

概念上可以在运行时确定您正在使用的操作系统,并以编程方式在XP及更早版本上使用SetMute功能以及在Vista及更高版本上使用MMSystem功能进行切换。但是,期待有人在这里提供这样做的代码有点不合理。我提供的链接应该让你开始走上正确的轨道,当你遇到障碍时,通过这些障碍的具体帮助将是很好的问题。