Wer weiß, wie man das Windows XP-Volume mithilfe von C# programmgesteuert stumm schaltet?Stummschalten des Windows-Volumes mithilfe von C#
Antwort
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.
Sie könnten P/Invoke wie hier erläutert verwenden: http://www.microsoft.com/indonesia/msdn/pinvoke.aspx. Es geht tatsächlich durch die Schritte in Aufgabe 1: Ton stummschalten und Ton ganz oben aufheben.
Ich stieß auf this project das könnte von Interesse sein, wenn Sie Vista laufen.
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);
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); ' –
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
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
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
}
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
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. –
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;
}
}
Ist es möglich, in Vista/Win7? – meir
Unter Vista und höher müssen Sie IAudioEndpointVolume verwenden. –