Windows 10 může udržovat samostatné zvukové profily prorůzná zvuková zařízení. Pro každé připojené zvukové zařízení můžete nastavit jinou úroveň hlasitosti a po připojení zařízení se hlasitost upraví automaticky. Nikdo samozřejmě nechává zvukové zařízení neustále ztlumené. Zvýší nebo sníží hlasitost, ale nikdo obvykle neztlumí zvukové zařízení. Používáte-li s počítačem pár sluchátek a často je musíte odpojit, můžete použít malý skript PowerShell, který automaticky vypne zvuk, když odpojíte sluchátka.
To je něco, co mobilní telefony dělají, tj., po odpojení sluchátek se hudba automaticky zastaví. Logika toho je, že jste buď dokončili poslech hudby, nebo jste náhodně odstranili sluchátka a potřebujete rychlý způsob, jak ji vypnout. Skript byl v podstatě napsán na stejném principu Prateek Singh z GEEKEEFY.

Automaticky vypnout zvuk
Otevřete Poznámkový blok a vložte následující;
[cmdletbinding()] Param() #Adding definitions for accessing the Audio API Add-Type -TypeDefinition @" using System.Runtime.InteropServices; [Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IAudioEndpointVolume { // f(), g(), ... are unused COM method slots. Define these if you care 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) { #Clean all events in the current session since its in a infinite loop, to make a fresh start when loop begins Get-Event | Remove-Event -ErrorAction SilentlyContinue #Registering the Event and Waiting for event to be triggered 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 #Conditional logic to handle, When to Mute/unMute the machine using 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())]" } }
Uložte jej s příponou souboru PS1. Ujistěte se, že v rozevíracím seznamu typu souboru vyberete možnost „Všechny soubory“. Pojmenujte soubor, který vám na první pohled řekne, co dělá. Uložte jej na nějaké místo, které jej náhodou nechcete smazat, ale také tam, kde jej snadno najdete, pokud potřebujete.
Spuštění skriptu
PowerShell nemůže jen autorun skript. Je zde zabudované bezpečnostní opatření, které tomu brání, ale existuje cesta kolem. Máme podrobný článek o tom, jak to můžete udělat. Postupujte podle pokynů pro automatické spuštění skriptu PowerShell, který jste právě vytvořili, a pomocí naplánované úlohy spusťte skript při každém spuštění počítače.
Případně můžete skript spustit ručně při spuštění systému. Používám to už méně než 30 minut a nevím, jak jsem bez něj předtím žil.
Komentáře