Персоналізація звуку у Windows 10
Операційна система 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. За допомогою планувальника завдань ви можете налаштувати запуск сценарію при кожному завантаженні комп’ютера.
Крім того, можна запускати сценарій вручну при завантаженні системи. Після використання цього сценарію навіть протягом короткого часу, ви відчуєте, наскільки він зручний і корисний.