2008-09-30 19 views

Odpowiedz

0

Będziesz prawdopodobnie chcesz użyć komendy MCI: http://msdn.microsoft.com/en-us/library/ms709461(VS.85).aspx

należy dodać, że podczas gdy ten daje dobrą ogólną kontrolę nad mikserów wejściowych i wyjściowych w systemie Windows, może masz jakieś problemy z robieniem szczegółowe kontrole, jak ustawienie wzmocnienia mikrofonu itp.

Aha, jeśli jesteś na Vista, to po prostu zapomnij. To zupełnie inny model.

12

Stwierdzenie to dla 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); 

a następnie wykorzystać tę linię, aby wyciszyć/wyłączyć wyciszenie dźwięku.

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

Pracowałem z przyjemnością w XP dzięki. Jednak używam WPF, więc nie ma tego.Handle. Zamiast tego: 'public static void ToggleMute (uchwyt IntPtr) { SendMessageW (uchwyt, WM_APPCOMMAND, uchwyt, (IntPtr) APPCOMMAND_VOLUME_MUTE); } ' w WPF Window: ' VolumeXP.ToggleMute (nowa WindowInteropHelper (this) .Handle); ' –

+1

To ... pracował na Windows 7 - ale jestem w bibliotece, który jest uruchamiany w tle - nie w niczego, co kiedykolwiek będzie miało okno - próbuję wyciszyć inne okno - działa to - ale niezależnie od tego, co przekazuję do obsługi, (uchwyt okna innej aplikacji itp.), po prostu wycisza wielkość systemu głównego ... – BrainSlugs83

+0

Dlaczego używasz '0x80000'? 'APPCOMMAND_VOLUME_MUTE' jest zdefiniowane jako' 8'? Jednak gdy używam '8', to się nie powiedzie, ale kiedy używam twojego' 0x80000', to działa. To jest dziwne. – Noitidart

3

Co można użyć dla Windows Vista/7 i 8 prawdopodobnie zbyt:

Można użyć NAudio (http://naudio.codeplex.com/releases/view/79035). Pobierz najnowszą wersję. Wyodrębnij pliki DLL i odwołaj się do biblioteki DLL NAudio w swoim projekcie C#.

Następnie dodaj następujący kod, aby przejrzeć wszystkie dostępne urządzenia audio i wyciszyć je, jeśli to możliwe.

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

Dziękuję. Ta biblioteka działała, gdy wszystkie inne, które wypróbowałem, zawiodły. Mój problem był podobny do tego, ale nie do końca taki sam. To bardzo dobre znalezisko. Chciałbym móc głosować na ciebie więcej niż raz. – David

+0

Dzięki za przegłosowanie i opinie. Szukałem trochę czasu, zanim znalazłem łatwy sposób na wyciszenie dźwięku. Dlatego pomyślałem, rozpowszechniając wiedzę na temat niektórych pytań stackoverflow :) Cieszę się, że pomógł komuś. –

2

Zobacz 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; 
       } 
} 
Powiązane problemy