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

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

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

解决方法

在XP上你不可能要求的是什么;操作系统根本不支持每个应用程序的卷级别.

你可以通过创建一个类似于SoundActive的设置类来完成你想要的东西:布尔或PlaySounds:布尔或类似的东西.将它放在它自己的单元中,并有一个创建它的实例的初始化部分和一个释放它的终结部分(使其有效地成为全局值的集合).

需要访问这些设置的每个单元只使用包含它们的单元,并相应地调整行为.因此,您的每个子类或表格或其他任何需要检查的内容都会添加:

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

设置类还可以包含跟踪当前音量级别的方法(在XP上,系统范围级别),以及使用MMSystem音量功能增加或减少音量的方法(此处有大量示例,通过Google进行操作)所以).然后,您的应用可以使用OnActivate和OnDeactivate事件在应用获得焦点时设置音量级别,并在应用失去焦点时将其恢复到正确的音量.

在Vista及更高版本中,您可以使用我前面提到的IAudioEndPointVolume接口以及GetMasterVolumeLevel或SetMasterVolumeLevel方法来控制系统范围的卷(我有一个这样做的示例,以及相应的MMDevAPI接口定义)或设备级别卷(使用IMMDevioce.Activate)首先选择正确的设备,然后在ppInterface参数中从IMMDevice.Activate接收设备接口上的上述IAudioEndPointVolume方法.

对于单个应用程序,使用ISimpleAudioVolume接口,该接口有四种方法:GetMasterVolume和SetMasterVolume,它们控制应用程序音频会话的音量级别; GetMute和SetMute,允许您分别检索当前静音标志值或设置它. (MS的Larry Osterman是Vista和Win7中新的音频支持开发人员之一,他的博客上有一个很棒的starting point article,关于新API中的音频类型以及何时使用它们.)

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

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...