Како аутоматски искључити звук када су слушалице искључене на Виндовс 10

Windows 10 operativni sistem omogućava održavanje zasebnih audio profila za različite audio uređaje. Za svaki audio uređaj koji povežete, možete konfigurirati različite nivoe jačine zvuka, i kada je uređaj priključen, jačina zvuka će se automatski prilagoditi. Naravno, malo ko drži audio uređaj isključen sve vreme. Korisnici obično pojačavaju ili smanjuju jačinu zvuka, ali retko kada potpuno isključuju zvuk nekog audio uređaja.

Ukoliko koristite slušalice sa svojim desktop računarom i često ih morate isključivati, možete upotrebiti malu PowerShell skriptu koja će automatski isključiti zvuk kada odspojite slušalice.

Ovakvu funkciju imaju mobilni telefoni, gde se reprodukcija muzike automatski zaustavlja kada se isključe slušalice. Logika iza toga je da ste ili završili sa slušanjem muzike ili ste slučajno isključili slušalice i potreban vam je brz način da zaustavite zvuk. Ova skripta je zasnovana na istom principu, a kreirao ju je Pratik Sing sa GEEKEEFY-a.

Automatsko isključivanje zvuka

Otvorite Notepad i kopirajte sledeći kod:

[cmdletbinding()]
Param()

#Dodavanje definicija za pristup Audio API-ju
Add-Type -TypeDefinition @'
using System.Runtime.InteropServices;
[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IAudioEndpointVolume {
// f(), g(), ... su neiskorišćeni COM slotovi za metode. Definišite ih ako su vam potrebni
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(); // Neiskorišćeno
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)
{
#Čisti sve događaje u trenutnoj sesiji pošto je u beskonačnoj petlji, kako bi započeli od početka kada petlja počne
Get-Event | Remove-Event -ErrorAction SilentlyContinue

#Registruje događaj i čeka da se pokrene
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

#Uslovna logika za rukovanje, kada da isključite/uključite zvuk pomoću Audio API-ja
If($EventType -eq 3)
{
[Audio]::Mute = $true
Write-Verbose "Isključeno [$((Get-Date).tostring())]"
}
elseif($EventType -eq 2 -and [Audio]::Mute -eq $true)
{
[Audio]::Mute = $false
Write-Verbose "Uključeno [$((Get-Date).tostring())]"
}
}

Sačuvajte ovu datoteku sa ekstenzijom .ps1. Obavezno izaberite „Sve datoteke“ iz padajućeg menija tipa datoteke. Dajte datoteci ime koje će vam jasno ukazati na njenu funkciju. Sačuvajte je na mestu gde je malo verovatno da ćete je slučajno izbrisati, ali i gde je možete lako pronaći ukoliko je to potrebno.

Pokretanje skripte

PowerShell ne može automatski pokretati skripte bez intervencije korisnika. Postoji ugrađena sigurnosna mera koja to sprečava, ali postoji način da se to zaobiđe. Imamo detaljan članak o tome kako to možete učiniti. Pratite uputstva za automatsko pokretanje PowerShell skripte koju ste upravo kreirali i iskoristite zakazani zadatak da bi se skripta pokretala svaki put kada uključite računar.

Alternativno, možete ručno pokrenuti skriptu prilikom podizanja sistema. Lično koristim ovu skriptu manje od 30 minuta i ne mogu da zamislim kako sam do sada živeo bez nje.