muter Одной кнопкой глушит конкретное приложение в микшере громкости Windows - и той же кнопкой возвращает звук обратно. Цель не задаётся в конфиге: программа смотрит на **имя собственного exe**. Копия, переименованная в bf6.exe, управляет сессией bf6.exe в микшере. Копия aimp.exe - сессией AIMP. Одна и та же сборка, разные имена файлов.
Find a file
2026-09-21 00:02:47 +05:00
docs first commit 2026-09-20 23:53:55 +05:00
src first commit 2026-09-20 23:53:55 +05:00
.gitignore add exe file 2026-09-21 00:02:47 +05:00
bf6.exe add exe file 2026-09-21 00:02:22 +05:00
Cargo.lock first commit 2026-09-20 23:53:55 +05:00
Cargo.toml first commit 2026-09-20 23:53:55 +05:00
README.md add exe file 2026-09-21 00:02:22 +05:00

muter

Одной кнопкой глушит конкретное приложение в микшере громкости Windows - и той же кнопкой возвращает звук обратно.

Цель не задаётся в конфиге: программа смотрит на имя собственного exe. Копия, переименованная в bf6.exe, управляет сессией bf6.exe в микшере. Копия aimp.exe - сессией AIMP. Одна и та же сборка, разные имена файлов.

Окна нет, консоль не мигает. По желанию - подсказка у курсора на пару секунд.

Как выглядит

Тёмная тема Светлая тема
Подсказка в тёмной теме Подсказка в светлой теме

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

  1. Берёт имя своего exe → это имя целевого процесса.
  2. Перебирает аудиосессии устройства вывода по умолчанию (IAudioSessionManager2), ищет сессии, чей процесс так называется.
  3. Ставит громкость 0.0 или 1.0 через ISimpleAudioVolume.
  4. Текущее состояние пишет в .txt рядом с собой: bf6.exe → bf6.txt, где 0 - звук выключен, 1 - включён.

Файл состояния создаётся при первом запуске и пишется только после успешной работы с микшером.

Сборка

Нужен Rust с MSVC-тулчейном (x86_64-pc-windows-msvc).

cargo build --release

Готовый бинарник: target\release\muter.exe, около 175 КБ.

Установка

Скопировать бинарник куда угодно и переименовать в имя процесса, которым хочется управлять:

copy target\release\muter.exe bf6.exe

Дальше запуск bf6.exe переключает звук сессии bf6.exe. Обычно это вешается на горячую клавишу.

Параметры запуска

Аргумент Что делает
(без аргументов) Переключает звук молча, ничего не показывает
--show Показывает подсказку у курсора 3000 мс
--show=N Показывает подсказку N миллисекунд
--color=black Тёмная плашка (светлый текст)
--color=white Светлая плашка (тёмный текст)
(без --color) Тема берётся из настроек Windows

Текст подсказки собирается из имени файла без расширения, в верхнем регистре: bf6.exe → BF6 звук выключен / BF6 звук включён.

Системная тема читается из HKCU\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize\AppsUseLightTheme (0 - тёмная). Ключа нет - считается светлой.

Примеры

bf6.exe                                 :: тихо, без окна
bf6.exe --show                          :: подсказка 3 секунды, тема от системы
bf6.exe --show=5000                     :: подсказка 5 секунд
bf6.exe --show=5000 --color=black       :: 5 секунд, принудительно тёмная
bf6.exe --show --color=white            :: 3 секунды, принудительно светлая

Форма через пробел (--show 5000, --color black) тоже понимается - на случай привычки.

Нечисловое значение (--show=abc) откатывается на 3000 мс. Неизвестный цвет (--color=синий) откатывается на системную тему.

Поведение окна

  • Не забирает фокус (WS_EX_NOACTIVATE) - поверх полноэкранной игры не должно её сворачивать.
  • Не появляется в панели задач (WS_EX_TOOLWINDOW), всегда поверх остальных (WS_EX_TOPMOST).
  • Ширина подгоняется под текст.
  • Если курсор у края экрана, окно сдвигается внутрь рабочей области того монитора, на котором курсор.
  • Позиция берётся один раз в момент показа - за мышкой окно не ездит.

Нюансы и известные проблемы

Состояние разъезжается, если целевой процесс не запущен. Сейчас .txt перезаписывается и подсказка показывается даже тогда, когда подходящих аудиосессий не нашлось. То есть при незапущенной игре нажатие покажет BF6 звук выключен, хотя глушить было нечего, а следующее нажатие уже в игре сработает наоборот. Лечится либо счётчиком найденных сессий, либо отказом от .txt в пользу чтения реальной громкости через GetMasterVolume().

Ручной сдвиг ползунка в микшере проходит мимо. Файл состояния об этом не узнает, и следующее нажатие промахнётся.

Ищется только устройство вывода по умолчанию. Если звук игры идёт на другое устройство, сессия не найдётся.

Структура

src/main.rs      весь код
Cargo.toml       зависимость только windows-rs
docs/            скриншоты для README