Windows 10 може да поддържа отделни аудио профили заразлични аудио устройства. За всяко аудио устройство, което свързвате, можете да зададете различно ниво на силата на звука и когато устройството е свързано, силата на звука ще се регулира автоматично. Разбира се, никой не поддържа аудио устройство заглушено през цялото време. Те ще увеличават или намаляват силата на звука, но никой обичайно не заглушава аудио устройство. Ако използвате чифт слушалки с вашия работен плот и често се налага да ги изключите, можете да използвате малко скрипт PowerShell, който автоматично ще заглуши звука, когато изключите слушалките.
Това е нещо, което мобилните телефони правят, т.е., когато изключите слушалките, музиката спира автоматично. Логиката зад това е, че или сте слушали музика, или случайно сте извадили слушалките и ви е необходим бърз начин да я изключите. Сценарият е написан основно на същия принцип от Пратек Синг от GEEKEEFY.

Автоматично заглушаване на звука
Отворете Бележника и поставете следното;
[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 минути и не знам как живеех без него преди.
Коментари