Sistemul Windows 10 are capacitatea de a stoca setări audio distincte pentru fiecare dispozitiv conectat. Astfel, poți configura niveluri de volum specifice pentru fiecare dispozitiv, iar acestea vor fi aplicate automat când dispozitivul este conectat. În general, utilizatorii modifică volumul, nu dezactivează complet un dispozitiv audio.
Dacă folosești căști împreună cu computerul și le deconectezi frecvent, poți utiliza un script PowerShell simplu care va dezactiva automat sunetul când deconectezi căștile.
Această funcționalitate se regăsește și pe telefoanele mobile unde muzica se oprește automat la deconectarea căștilor. Raționamentul este că fie utilizatorul a terminat de ascultat, fie a scos accidental căștile și are nevoie de o metodă rapidă de a opri sunetul. Acest script a fost inspirat din ideea lui Prateek Singh de la GEEKEEFY.
Dezactivarea automată a sunetului
Deschide aplicația Notepad și copiază următorul cod:
[cmdletbinding()] Param() #Definirea accesului la API-ul audio Add-Type -TypeDefinition @' using System.Runtime.InteropServices; [Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IAudioEndpointVolume { // f(), g(), ... sunt sloturi de metodă COM neutilizate. Definește-le dacă ai nevoie 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(); // Neutilizat 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) { #Șterge toate evenimentele din sesiunea curentă, deoarece este într-o buclă infinită, pentru un nou început la începerea buclei Get-Event | Remove-Event -ErrorAction SilentlyContinue #Înregistrează evenimentul și așteaptă declanșarea acestuia 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 #Logica condițională pentru a gestiona când să dezactivezi/activezi sunetul folosind API-ul audio If($EventType -eq 3) { [Audio]::Mute = $true Write-Verbose "S-a dezactivat sunetul [$((Get-Date).tostring())]" } elseif($EventType -eq 2 -and [Audio]::Mute -eq $true) { [Audio]::Mute = $false Write-Verbose "S-a activat sunetul [$((Get-Date).tostring())]" } }
Salvează-l cu extensia de fișier PS1. Asigură-te că selectezi „Toate fișierele” din meniul derulant tip fișier. Alege un nume sugestiv pentru a identifica scopul fișierului. Salvează-l într-o locație sigură, unde nu îl vei șterge accidental, dar unde îl poți găsi cu ușurință când ai nevoie.
Executarea Scriptului
PowerShell nu poate rula un script automat. Există o măsură de securitate integrată care blochează acest lucru, dar există soluții. Avem un articol detaliat despre cum să faci asta. Urmează instrucțiunile pentru a rula automat scriptul PowerShell pe care tocmai l-ai creat, utilizând o sarcină planificată care să activeze scriptul de fiecare dată când pornești computerul.
Alternativ, poți executa manual scriptul la pornirea sistemului. Personal, îl folosesc de scurt timp și mi-a devenit indispensabil.