2008-09-30 14 views

Antwort

0

werden Sie wahrscheinlich MCI-Befehle verwenden möchten: http://msdn.microsoft.com/en-us/library/ms709461(VS.85).aspx

sollte ich hinzufügen, dass während dieser Sie gute allgemeine Kontrolle über die Eingangs- und Ausgangsmischer in den Fenstern geben, Sie Schwierigkeiten mit dem Tun detaillierte Kontrollen haben kann, wie die Einstellung der Mikrofonverstärkung usw.

Oh, und wenn Sie auf Vista sind, dann vergessen Sie es einfach. Es ist ein völlig anderes Modell.

12

erklären dies für 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); 

Und dann diese Linie um den Ton auszuschalten verwenden/aufzuheben.

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

Arbeitete eine Belohnung in XP danke. Allerdings benutze ich WPF, also gibt es kein this.Handle. Stattdessen: 'öffentliche statische void ToggleMute (IntPtr Handle) { SendMessageW (Handle, WM_APPCOMMAND, behandeln, (IntPtr) APPCOMMAND_VOLUME_MUTE); } ' In WPF-Fenster: ' VolumeXP.ToggleMute (neue WindowInteropHelper (this) .Handle); ' –

+1

Dies ... arbeitete unter Windows 7 - aber ich bin in einer Bibliothek, die im Hintergrund ausgeführt wird - nicht in irgendwas, das jemals ein Fenster haben wird - ich versuche ein anderes Fenster zu stummeln - das funktioniert - aber egal, was ich als Handle übergebe (Fenstergriff einer anderen Anwendung usw.), es stummt einfach Das Master-System-Volume ... – BrainSlugs83

+0

Warum verwenden Sie '0x80000'? 'APPCOMMAND_VOLUME_MUTE' ist definiert als' 8'? Aber wenn ich '8' benutze, schlägt es fehl, aber wenn ich '0x80000' verwende, funktioniert es. Das ist komisch. – Noitidart

3

Was Sie für Windows Vista/7 verwenden können, und wahrscheinlich 8 zu:

Sie können NAudio verwenden (http://naudio.codeplex.com/releases/view/79035). Laden Sie die neueste Version herunter. Extrahieren Sie die DLLs, und verweisen Sie in Ihrem C# -Projekt auf das DLL NAudio.

Fügen Sie dann den folgenden Code hinzu, um alle verfügbaren Audiogeräte zu durchlaufen und wenn möglich zu stummschalten.

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

Vielen Dank. Diese Bibliothek hat funktioniert, als alle anderen, die ich versucht habe, fehlgeschlagen sind. Mein Problem war diesem ähnlich, aber nicht genau dasselbe. Das ist ein sehr guter Fund. Ich wünschte, ich könnte dich mehr als einmal abstimmen. – David

+0

Danke für die Verbesserung und Feedback. Ich habe eine Weile gesucht, bevor ich eine einfache Möglichkeit gefunden habe, den Ton stumm zu schalten. Deshalb, dachte ich, verbreite ich das Wissen über einige Stackoverflow-Fragen :) Ich bin froh, dass es jemandem geholfen hat. –

2

Siehe 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; 
       } 
}