delphi - una - Cómo silenciar el sonido de mi aplicación?
cómo quitar el sonido de me gusta en facebook (2)
XP no es compatible con el control de volumen por aplicación. Esa capacidad se agregó en Vista. Entonces, lo que estás intentando hacer no se puede hacer en XP de manera justa.
Hay un software llamado IndieVolume que retro ajusta el control de volumen por aplicación a XP. Solo puedo imaginar que lo hace por medio de pirateo de bajo nivel, inyección de DLL, etc. Dudo que sea realmente una opción para ti.
Tengo una aplicación que tiene sonido. Tengo una propiedad global para silenciar el sonido. El problema es que hay muchas cosas diferentes que pueden hacer que el sonido, me gustaría iterar a través de diferentes tipos de clase y silenciar / activar el sonido. En cambio, estoy buscando una manera de silenciar el sonido en un nivel de aplicación global. No me refiero a silenciar todo el volumen del sistema tampoco.
Un escenario: en Windows 7, puede abrir el Mezclador de volumen y ajustar el volumen de las aplicaciones individuales. Si bien no pretendo cambiar este valor particular real (ya que sé que es específico de Windows 7), me gustaría cambiar el volumen de todo en mi aplicación de una sola vez. También necesitaría la capacidad de silenciar por completo el sonido de todo en mi aplicación. Necesito esta capacidad para ser compatible con Windows XP y superior. Supongo que implicará llamadas a la API de Windows, pero no tengo idea de qué llamadas hacer.
Lo que estás pidiendo no es posible en XP; el sistema operativo simplemente no admite niveles de volumen por aplicación.
Puede lograr lo que desea creando una clase de configuración que mantenga cosas como SoundActive: Boolean
o PlaySounds: Boolean
o algo similar. Colóquelo en su propia unidad, y tenga una sección de inicialización que cree una instancia de la misma y una sección de finalización que la libere (convirtiéndola efectivamente en una colección de valores globales).
Cada unidad que necesita acceso a estas configuraciones simplemente usa la unidad que las contiene, y ajusta el comportamiento en consecuencia. Entonces, cada una de sus clases o formularios secundarios o lo que sea solo necesitaría un cheque agregado:
if CurrentSettings.PlaySounds then
// Code that makes sounds, plays music, whatever.
La clase de configuración también puede contener métodos que realizan un seguimiento del nivel de volumen actual (en XP, el nivel de todo el sistema) y métodos para aumentar o disminuir el volumen utilizando las MMSystem
volumen del sistema MMSystem
(hay MMSystem
ejemplos aquí y Google haciendo asi que). Luego, su aplicación puede usar los eventos OnActivate
y OnDeactivate
para establecer el nivel de volumen cuando su aplicación se enfoca y restaurarlo al volumen adecuado cuando la aplicación pierde el foco.
En Vista y superior, puede usar la interfaz IAudioEndPointVolume
que mencioné anteriormente y los métodos GetMasterVolumeLevel
o SetMasterVolumeLevel
para controlar el volumen del sistema (tengo un ejemplo de MMDevAPI
hacerlo, junto con las definiciones de interfaz MMDevAPI
apropiadas) o el volumen del dispositivo (utilizando IMMDevioce.Activate
para seleccionar primero el dispositivo adecuado y luego los métodos anteriores de IAudioEndPointVolume
en la interfaz del dispositivo recibidos de IMMDevice.Activate
en el parámetro ppInterface
).
Para aplicaciones individuales, utiliza la interfaz ISimpleAudioVolume
, que tiene cuatro métodos: GetMasterVolume
y SetMasterVolume
, que controlan el nivel de volumen de la sesión de audio de su aplicación, y GetMute
y SetMute
para permitirle recuperar el valor de indicador de silencio actual o establecerlo respectivamente. (Larry Osterman de MS, quien fue uno de los desarrolladores que trabajó en el nuevo soporte de audio en Vista y Win7, tiene un excelente artículo de inicio en su blog sobre los tipos de audio en la nueva API y cuándo usar cada uno de ellos. )
Es conceptualmente posible determinar en tiempo de ejecución qué sistema operativo está utilizando, y cambiar de forma programática entre el uso de la funcionalidad MMSystem
en XP y versiones anteriores, y la funcionalidad MMDevAPI
en Vista y MMDevAPI
posteriores. Sin embargo, esperar que alguien aquí proporcione el código para hacerlo es un poco irracional. Los enlaces que he proporcionado deberían ayudarlo a comenzar por el camino correcto, y cuando se topa con inconvenientes en el camino, la ayuda específica para resolver esos inconvenientes sería una gran pregunta.