Автоматическое отключение звука при отключении наушников

Кратко
Этот простой PowerShell‑скрипт автоматически включает «mute» на динамиках, когда вы отключаете наушники, и возвращает звук при повторном подключении. Подойдёт для Windows 10/11; описаны запуск, автозапуск и типичные проблемы.
Зачем это нужно
Неприятность: вы случайно оставили громкость и разбудили соседей или открыли плейлист на всю громкость. Скрипт решает эту проблему автоматически — похожее поведение есть в смартфонах.
Как это работает (в одной строке)
Скрипт подписывается на события Win32_DeviceChangeEvent и использует Windows Audio API через добавленный тип .NET, чтобы включать/выключать системный mute при событиях подключения/отключения устройств.
Сам скрипт
Вставьте полностью этот фрагмент в блокнот и сохраните как .ps1 (инструкции ниже):
` [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())]"
}
}`
Как сохранить и запустить
- Откройте Блокнот, вставьте код и в меню «Файл» → «Сохранить как…» выберите Тип файла: «Все файлы» (“Все файлы”), имя: AutoMute.ps1. Кодировку можно оставить UTF-8.
- Чтобы запустить: правый клик по AutoMute.ps1 → «Запустить». Окно PowerShell будет запущено, скрипт выполнится и останется работать до закрытия окна или выключения ПК.
Важно
По умолчанию Windows блокирует выполнение внешних скриптов. Если при запуске получите ошибку ExecutionPolicy, разрешите выполнение для текущего пользователя:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
Если окно PowerShell закрыть — скрипт остановится. Чтобы он работал постоянно в фоне, настройте автозапуск (ниже).
Автозапуск с помощью Планировщика задач
- Откройте Планировщик задач (Task Scheduler).
- Создайте задачу: Тригер — «При входе в систему», Действие — «Запустить программу»: программа: powershell.exe, аргументы: -ExecutionPolicy Bypass -WindowStyle Hidden -File “C:\путь\к\AutoMute.ps1”.
- В свойствах укажите «Выполнять независимо от входа пользователя», если хотите, чтобы скрипт запускался до входа.
Совет: используйте абсолютный путь к файлу и проверьте, что задача выполняется под той учётной записью, для которой нужно работать звук.
Частые проблемы и решения
- Скрипт не реагирует на Bluetooth‑наушники: некоторые Bluetooth‑адаптеры и драйверы не генерируют ожидаемые Win32_DeviceChangeEvent в виде 2/3, или создают виртуальные аудиоустройства. Решение: проверить, какие события приходят, и при необходимости адаптировать логику обработки.
- Скрипт глушит всегда: возможно, событие подключения определяется иначе. Временное решение — запускать скрипт вручную и смотреть вывод Write-Verbose или журнал событий.
- Требуются права администратора: обычно нет, но в некоторых системах доступ к COM‑интерфейсам требует расширенных прав.
Альтернативы
- Использовать сторонние утилиты для управления аудио с триггером устройства (если не хочется править скрипт).
- Создать небольшую службу Windows, если нужен более надёжный фоновый процесс (требует разработки).
Критерии приёмки
- При отключении наушников системные динамики автоматически переводятся в mute.
- При повторном подключении звук возвращается, если ранее был включён.
- Скрипт не мешает ручному управлению громкостью.
- Скрипт запускается автоматически при входе в систему (если настроен автозапуск).
Итог
PowerShell позволяет легко автоматизировать отключение звука при извлечении наушников: скрипт подписывается на события устройств и управляет системным mute через Audio API. Для постоянной работы используйте Планировщик задач или реализуйте службу. Проверяйте поведение на вашем оборудовании — Bluetooth и виртуальные аудиоадаптеры иногда дают другие события.
Image Credit: peus/Depositphotos
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone