Unter Windows 10 ist es möglich, für jedes angeschlossene Audiogerät ein separates Audioprofil zu führen. Das bedeutet, dass man die Lautstärke für jedes Gerät individuell einstellen kann. Sobald ein Gerät verbunden ist, wird diese Lautstärke automatisch wiederhergestellt. In der Regel wird ein Audiogerät nicht dauerhaft stummgeschaltet. Man passt die Lautstärke an, aber das Stummschalten ist eher eine Ausnahme.
Wer beispielsweise Kopfhörer am Desktop-PC nutzt und diese oft ein- und aussteckt, kann ein kleines PowerShell-Skript verwenden. Dieses Skript schaltet den Ton automatisch stumm, wenn die Kopfhörer abgezogen werden.
Dieses Verhalten kennt man von Mobiltelefonen. Dort wird die Musikwiedergabe automatisch angehalten, wenn die Kopfhörer entfernt werden. Dies dient dem Zweck, dass man entweder mit dem Musikhören aufhört oder versehentlich den Stecker gezogen hat und die Musik schnell stoppen möchte. Das hier vorgestellte Skript basiert auf dem gleichen Prinzip, welches Prateek Singh von GEEKEEFY vorgestellt hat.
Automatisches Stummschalten des Tons
Zuerst öffnen Sie den Editor Notepad und kopieren folgenden Code hinein:
[cmdletbinding()] Param() #Definitionen für den Zugriff auf die Audio-API hinzufügen Add-Type -TypeDefinition @' using System.Runtime.InteropServices; [Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IAudioEndpointVolume { // f(), g(), ... sind ungenutzte COM-Methoden-Slots. Definieren Sie diese, wenn sie relevant sind int f(); int g(); int h(); int i(); int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext); int j(); int GetMasterVolumeLevelScalar(out float pfLevel); int k(); int l(); int m(); int n(); int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext); int GetMute(out bool pbMute); } [Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IMMDevice { int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev); } [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IMMDeviceEnumerator { int f(); // Unused int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint); } [ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { } public class Audio { static IAudioEndpointVolume Vol() { var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator; IMMDevice dev = null; Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev)); IAudioEndpointVolume epv = null; var epvid = typeof(IAudioEndpointVolume).GUID; Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv)); return epv; } public static float Volume { get {float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v;} set {Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty));} } public static bool Mute { get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; } set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); } } } '@ -Verbose While($true) { #Alle Events der aktuellen Sitzung löschen, um mit einem sauberen Zustand zu beginnen, wenn die Schleife von vorne startet Get-Event | Remove-Event -ErrorAction SilentlyContinue #Das Event registrieren und auf das Auslösen des Events warten Register-WmiEvent -Class Win32_DeviceChangeEvent Wait-Event -OutVariable Event |Out-Null $EventType = $Event.sourceargs.newevent | Sort-Object TIME_CREATED -Descending | Select-Object EventType -ExpandProperty EventType -First 1 #Bedingungslogik für das Stummschalten/Aufheben der Stummschaltung mit der Audio-API If($EventType -eq 3) { [Audio]::Mute = $true Write-Verbose "Muted [$((Get-Date).tostring())]" } elseif($EventType -eq 2 -and [Audio]::Mute -eq $true) { [Audio]::Mute = $false Write-Verbose "UnMuted [$((Get-Date).tostring())]" } }
Speichern Sie die Datei mit der Dateiendung .ps1. Wählen Sie im Dropdown-Menü „Dateityp“ die Option „Alle Dateien“. Geben Sie der Datei einen aussagekräftigen Namen, der auf den ersten Blick erkennen lässt, was das Skript bewirkt. Speichern Sie es an einem Ort, an dem es nicht versehentlich gelöscht wird und wo es dennoch bei Bedarf leicht zu finden ist.
Ausführen des Skripts
PowerShell kann ein Skript nicht ohne Weiteres automatisch ausführen. Eine integrierte Sicherheitsmaßnahme verhindert dies, aber es gibt eine Möglichkeit, diese zu umgehen. Es gibt im Netz eine ausführliche Anleitung, wie man das genau macht. Folgen Sie dieser Anleitung, um das soeben erstellte PowerShell-Skript automatisch auszuführen. Nutzen Sie dann eine geplante Aufgabe, damit das Skript jedes Mal startet, wenn der PC hochgefahren wird.
Alternativ kann das Skript natürlich auch manuell gestartet werden, wenn das System hochfährt. Die Anwendung des Skripts ist sehr nützlich und macht die Arbeit komfortabler.