2008-09-30 17 views

Respuesta

0

es probable que desee utilizar los comandos MCI: http://msdn.microsoft.com/en-us/library/ms709461(VS.85).aspx

debo añadir que, si bien esto le dará un buen control general de los mezcladores de entrada y salida en las ventanas, es posible que tenga alguna dificultad con la realización de controles detallados, como el establecimiento del impulso micrófono, etc.

Ah, y si estás en Vista, a continuación, sólo olvídalo. Es un modelo totalmente diferente.

2

me encontré con this project que podrían ser de interés, si se está ejecutando Vista.

12

nuevas de esto para P/Invoke:

private const int APPCOMMAND_VOLUME_MUTE = 0x80000; 
private const int WM_APPCOMMAND = 0x319; 

[DllImport("user32.dll")] 
public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); 

y luego usar esta línea para activar/desactivar el sonido.

SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle, (IntPtr) APPCOMMAND_VOLUME_MUTE); 
+1

Trabajó un placer en XP gracias. Sin embargo, estoy usando WPF así que no hay esto. Handle. En cambio: 'public static void ToggleMute (identificador IntPtr) { SendMessageW (handle, WM_APPCOMMAND, handle, (IntPtr) APPCOMMAND_VOLUME_MUTE); } ' En ventana de WPF: ' VolumeXP.ToggleMute (new WindowInteropHelper (this) .Handle); ' –

+1

Esto ... funcionó en Windows 7 - pero estoy en una biblioteca, que se ejecuta en segundo plano - no en cualquier cosa que alguna vez tenga una ventana - estoy tratando de silenciar otra ventana - esto funciona - pero independientemente de lo que pase por el manejo, (manejador de ventana de otra aplicación, etc.), simplemente se apaga el volumen del sistema maestro ... – BrainSlugs83

+0

¿Por qué usas '0x80000'? 'APPCOMMAND_VOLUME_MUTE' se define como' 8'? Sin embargo, cuando uso '8', falla, pero cuando uso su' 0x80000' funciona. Esto es raro. – Noitidart

3

Lo que se puede usar para Windows Vista/7 y 8, probablemente demasiado:

Puede utilizar NAudio (http://naudio.codeplex.com/releases/view/79035). Descargue la última versión. Extraiga las DLL y haga referencia a la DLL NAudio en su proyecto C#.

A continuación, añada el siguiente código para iterar a través de todos los dispositivos de audio disponibles y silenciar, si es posible.

try 
    { 
     //Instantiate an Enumerator to find audio devices 
     NAudio.CoreAudioApi.MMDeviceEnumerator MMDE = new NAudio.CoreAudioApi.MMDeviceEnumerator(); 
     //Get all the devices, no matter what condition or status 
     NAudio.CoreAudioApi.MMDeviceCollection DevCol = MMDE.EnumerateAudioEndPoints(NAudio.CoreAudioApi.DataFlow.All, NAudio.CoreAudioApi.DeviceState.All); 
     //Loop through all devices 
     foreach (NAudio.CoreAudioApi.MMDevice dev in DevCol) 
     { 
      try 
      { 
       //Show us the human understandable name of the device 
       System.Diagnostics.Debug.Print(dev.FriendlyName); 
       //Mute it 
       dev.AudioEndpointVolume.Mute = true; 
      } 
      catch (Exception ex) 
      { 
       //Do something with exception when an audio endpoint could not be muted 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     //When something happend that prevent us to iterate through the devices 
    } 
+0

Gracias. Esta biblioteca funcionó cuando fallaron todas las demás que probé. Mi problema era similar a este, pero no exactamente lo mismo. Este es un muy buen hallazgo. Ojalá pudiera votarte más de una vez. – David

+0

Gracias por el voto positivo y los comentarios. Busqué por un tiempo antes de encontrar una manera fácil de silenciar el sonido. Por lo tanto, pensé, difundir el conocimiento en algunas preguntas stackoverflow :) Me alegro de que ayudó a alguien. –

2

Ver How to programmatically mute the Windows XP Volume using C#?

void SetPlayerMute(int playerMixerNo, bool value) 
{ 
     Mixer mx = new Mixer(); 
     mx.MixerNo = playerMixerNo; 
     DestinationLine dl = mx.GetDestination(Mixer.Playback); 
     if (dl != null) 
      foreach (MixerControl ctrl in dl.Controls) 
       if (ctrl is MixerMuteControl) 
       { 
        ((MixerMuteControl)ctrl).Value = (value) ? 1 : 0; 
        break; 
       } 
} 
Cuestiones relacionadas