Гид по технологиям

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

3 min read PowerShell Обновлено 09 Jan 2026
Автоматическое отключение звука при снятии наушников
Автоматическое отключение звука при снятии наушников

наушники на ноутбуке после микширования музыки

Было бы здорово, если бы компьютер автоматически отключал звуковой выход при отсоединении наушников — чтобы не разбудить соседей по квартире или не выдать свои музыкальные предпочтения в публичном месте. Вы можете делать это вручную через «Микшер громкости», но проще автоматизировать процесс с помощью PowerShell.

Ниже — простой способ автоматически заглушать звук на ПК при удалении наушников, аналогично тому, как делают смартфоны.

Как это работает

Скрипт использует Windows Audio API через определение COM-интерфейсов в PowerShell. Он регистрирует событие смены устройств (Win32_DeviceChangeEvent) и в бесконечном цикле ожидает события: если тип события соответствует удалению устройства, скрипт выставляет флаг Mute = true; если устройство подключается и звук был заглушен — снимает заглушение.

Ключевые понятия в одной строке:

  • COM-интерфейс: механизм Windows для вызова компонент системы.
  • Win32_DeviceChangeEvent: WMI-событие изменения состояния устройств.

Шаги — вставьте этот код в блокнот

Откройте Блокнот и вставьте точно этот код в пустой документ:

    [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())]"
}
}

Сохранение и запуск

  1. В диалоге «Сохранить как» выберите тип файла «Все файлы» и сохраните с расширением .ps1, например AutoMute.ps1.
  2. Чтобы запустить скрипт, кликните правой кнопкой по файлу и выберите «Запустить». Скрипт будет работать до следующей перезагрузки или пока вы не закроете окно PowerShell.

Важно: при необходимости используйте права администратора, если система блокирует выполнение скриптов (Execution Policy). Можно временно разрешить запуск командой в PowerShell с правами администратора: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Альтернативные подходы

  • NirCmd или SoundVolumeView (утилиты NirSoft) — позволяют менять громкость и mute через командную строку и легче интегрируются с планировщиком задач.
  • AutoHotkey — подойдёт, если вы уже используете скрипты для других автоматизаций и хотите GUI-интеграцию.
  • Планировщик задач + события Windows — вариант для продвинутых сценариев, когда требуется запускать действия по триггеру без постоянного фонового процесса.

Когда это может не сработать

  • Если аудио-устройство не регистрирует стандартные WMI-события при отсоединении (редкие аппаратные конфигурации).
  • При нестандартных аудиодрайверах или виртуальных аудио-устройствах поведение может отличаться.
  • Ограничения политики выполнения PowerShell (Execution Policy) могут помешать запуску.

Критерии приёмки

  • При физическом отключении наушников звук системы становится заглушённым (Mute).
  • При повторном подключении наушников звук возвращается, если был заглушён скриптом.
  • Скрипт не вызывает ошибок в системном журнале при обычных событиях подключения/отключения.

Риски и меры смягчения

  • Риск: скрипт может заглушать звук, когда вы не хотите. Мера: добавьте логирование или подтверждение перед изменением состояния.
  • Риск: конфликт с другими утилитами управления звуком. Мера: протестируйте на рабочей машине и при необходимости исключите виртуальные устройства.

Контроль качества — тесты

  • Тест 1: подключите и отключите проводные наушники — проверьте изменение Mute.
  • Тест 2: подключите Bluetooth-гарнитуру — проверьте, регистрируется ли событие и изменяется ли статус.
  • Тест 3: проверьте поведение с несколькими устройствами воспроизведения одновременно.

Быстрый плейбук для администратора

  1. Скопировать скрипт на целевую машину.
  2. Установить политику выполнения для текущего пользователя (если нужно).
  3. Запустить скрипт вручную и проверить логи через Write-Verbose.
  4. При необходимости настроить автозапуск через Планировщик задач с «При входе в систему». (Опционально: запускать в контексте пользователя.)

Резюме

  • Простой PowerShell-скрипт помогает автоматически заглушать звук при снятии наушников.
  • Подойдёт пользователям, которые хотят избежать неудобств и не против держать простой фоновой процесс.
  • Для более интегрированных решений можно рассмотреть утилиты NirSoft или AutoHotkey.

Фото: peus/Depositphotos

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство