Windows 10 може да поддържа отделни аудио профили за различни аудио устройства. За всяко аудио устройство, което свързвате, можете да зададете различно ниво на силата на звука и когато устройството е свързано, силата на звука ще се регулира автоматично. Разбира се, никой не държи звука на аудио устройство през цялото време. Те ще увеличат или намалят силата на звука, но никой не заглушава по навик аудио устройство.
Ако използвате чифт слушалки с вашия работен плот и често се налага да ги изключвате, можете да използвате малък скрипт на PowerShell, който автоматично ще заглуши звука, когато изключите слушалките си.
Това е нещо, което правят мобилните телефони, т.е. когато изключите слушалките си, музиката спира автоматично. Логиката зад това е, че или сте приключили със слушането на музика, или случайно сте свалили слушалките си и имате нужда от бърз начин да ги изключите. Сценарият основно е написан на същия принцип от Пратик Сингх от GEEKEEFY.
Автоматично заглушаване на звука
Отворете Notepad и поставете следното;
[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())]" } }
Запазете го с разширението на файла PS1. Уверете се, че сте избрали „Всички файлове“ от падащото меню тип файл. Дайте на файла име, което ще ви каже с един поглед какво прави. Запазете го някъде, където е малко вероятно да го изтриете случайно, но и където можете лесно да го намерите, ако трябва.
Изпълнение на скрипта
PowerShell не може просто да стартира автоматично скрипт. Има вградена мярка за сигурност, която му пречи да го направи, но има начин да го заобиколите. Имаме подробна статия за това как можете да направите точно това. Следвайте инструкциите, за да стартирате автоматично скрипта PowerShell, който току-що създадохте, и използвайте планирана задача, за да стартирате скрипта всеки път, когато стартирате компютъра си.
Като алтернатива можете да стартирате ръчно скрипта, когато стартирате системата си. Използвам го от по-малко от 30 минути и не знам как живеех без него преди.