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

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

4 min read PowerShell Обновлено 12 Dec 2025
Автоматическое отключение звука при отключении наушников
Автоматическое отключение звука при отключении наушников

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

Кратко

Этот простой 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())]"
}
}`
    

Как сохранить и запустить

  1. Откройте Блокнот, вставьте код и в меню «Файл» → «Сохранить как…» выберите Тип файла: «Все файлы» (“Все файлы”), имя: AutoMute.ps1. Кодировку можно оставить UTF-8.
  2. Чтобы запустить: правый клик по AutoMute.ps1 → «Запустить». Окно PowerShell будет запущено, скрипт выполнится и останется работать до закрытия окна или выключения ПК.

Важно

  • По умолчанию Windows блокирует выполнение внешних скриптов. Если при запуске получите ошибку ExecutionPolicy, разрешите выполнение для текущего пользователя:

    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -Force

  • Если окно PowerShell закрыть — скрипт остановится. Чтобы он работал постоянно в фоне, настройте автозапуск (ниже).

Автозапуск с помощью Планировщика задач

  1. Откройте Планировщик задач (Task Scheduler).
  2. Создайте задачу: Тригер — «При входе в систему», Действие — «Запустить программу»: программа: powershell.exe, аргументы: -ExecutionPolicy Bypass -WindowStyle Hidden -File “C:\путь\к\AutoMute.ps1”.
  3. В свойствах укажите «Выполнять независимо от входа пользователя», если хотите, чтобы скрипт запускался до входа.

Совет: используйте абсолютный путь к файлу и проверьте, что задача выполняется под той учётной записью, для которой нужно работать звук.

Частые проблемы и решения

  • Скрипт не реагирует на Bluetooth‑наушники: некоторые Bluetooth‑адаптеры и драйверы не генерируют ожидаемые Win32_DeviceChangeEvent в виде 2/3, или создают виртуальные аудиоустройства. Решение: проверить, какие события приходят, и при необходимости адаптировать логику обработки.
  • Скрипт глушит всегда: возможно, событие подключения определяется иначе. Временное решение — запускать скрипт вручную и смотреть вывод Write-Verbose или журнал событий.
  • Требуются права администратора: обычно нет, но в некоторых системах доступ к COM‑интерфейсам требует расширенных прав.

Альтернативы

  • Использовать сторонние утилиты для управления аудио с триггером устройства (если не хочется править скрипт).
  • Создать небольшую службу Windows, если нужен более надёжный фоновый процесс (требует разработки).

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

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

Итог

PowerShell позволяет легко автоматизировать отключение звука при извлечении наушников: скрипт подписывается на события устройств и управляет системным mute через Audio API. Для постоянной работы используйте Планировщик задач или реализуйте службу. Проверяйте поведение на вашем оборудовании — Bluetooth и виртуальные аудиоадаптеры иногда дают другие события.

Image Credit: 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 — руководство