Вопрос или проблема
Я пытаюсь написать пакетный файл в Windows 10, который позволит мне переключаться между гарнитурой и колонками в качестве устройства вывода по умолчанию при запуске. Я не хочу использовать стороннее программное обеспечение.
Я пытался искать, но нашел только старые скрипты, которые, кажется, не работают, и также ссылаются на путь HKCU:\Software\Microsoft\Windows\CurrentVersion\Applets\Volume Control\
, который, похоже, больше не существует. Я не могу найти никакой информации о реестре Windows 10 на этот счет, также я не хочу слишком много возиться с реестром, если я не уверен в том, что делаю.
Я понимаю, что вы не хотите использовать стороннее ПО, но если вам не против использовать ~100 KB exe, вы можете воспользоваться Nircmd с командами:
nircmd setdefaultsounddevice "Speakers" 1
или
nircmd setdefaultsounddevice "Headphones" 1
Вы должны убедиться, что используете точное название ваших аудиоустройств, как они указаны в разделе Устройства воспроизведения
(правая кнопка на управляющем звуком в системном трее). Возможно, проще будет переименовать их в разделе Свойства
в более простые имена, особенно если имена как-то пересекаются.
Цифра 1
в конце команды означает “Устройство по умолчанию”. Цифра 2
означает “Устройство связи по умолчанию”.
Если вы действительно не хотите использовать сторонний инструмент, вот дифф ключа реестра, который, кажется, изменяется, когда я меняю устройство для звука по умолчанию. Это может быть полезно вам, но я точно не знаю, что он делает. Это не так просто, как 1 или 0, чтобы указать, является ли оно устройством по умолчанию, похоже на то.
Решение PowerShell для переключения между двумя конкретными аудиоустройствами
Для этого требуется, чтобы вы загрузили и установили команды AudioDevice отсюда:
https://github.com/frgnca/AudioDeviceCmdlets
Следуйте их инструкциям по установке и проверьте, работают ли командлеты в вашем PowerShell.
Затем вы можете использовать этот скрипт:
<#
Use
Get-AudioDevice -List
to learn about available devices on your system.
Then set the two variables below with the start of their names.
#>
$device1 = "PHILIPS"
$device2 = "Speakers"
$Audio = Get-AudioDevice -playback
Write-Output "Аудиоустройство было " $Audio.Name
Write-Output "Аудиоустройство теперь установлено на "
if ($Audio.Name.StartsWith($device1)) {
(Get-AudioDevice -list | Where-Object Name -like ("$device2*") | Set-AudioDevice).Name
} Else {
(Get-AudioDevice -list | Where-Object Name -like ("$device1*") | Set-AudioDevice).Name
}
Затем вы можете установить этот скрипт как ярлык на вашей панели задач или где-либо еще. Вот пример ярлыка, который я использую:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -windowstyle hidden C:\Tools\ToggleSoundDevice.ps1
Вы также можете найти много решений для привязки клавиши быстрого доступа к этому.
Начиная с Windows 8 (или, возможно, раньше?) конфигурация аудио на ПК хранится в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render
.
Под Render
находятся ключи с именами GUID, каждый из которых содержит значение dword DeviceState
в корне. Но как это кодируется?
Смотрите Константы DEVICE_STATE_XXX на MSDN:
- 1 Активный
- 2 Отключен
- 4 Не присутствует
- 8 Отсоединен
Таким образом, скрипт powershell/bat для переключения между 1 и 2 должен помочь.
РЕДАКТ:
Чтобы получить читаемое название устройства, читайте {b3f8fa53-0004-438e-9003-51a46e139bfc},6
в подразделе Свойства
Скачайте nircmd из интернета, затем:
:: Установить звуковые устройства
NIRCMD setdefaultsounddevice "VoiceMeeter Input" 1^
& NIRCMD setdefaultsounddevice "VoiceMeeter Input" 2^
& NIRCMD setdefaultsounddevice "ANovaMic" 1^
& NIRCMD setdefaultsounddevice "ANovaMic" 2
Я использую эти небольшие скрипты из своей стрим-панели, не только для стриминга, но и для переключения между устройствами в любое время.
Вы можете сделать это с помощью SoundVolumeView от NirSoft.
Отсортируйте по Имени, затем по Имени устройства
Выберите устройство воспроизведения Speakers Device Render
Правая кнопка мыши – Создать ярлык на рабочем столе
Установить устройство по умолчанию – Все
Откройте свойства ярлыка и скопируйте целевой объект
“C:\tools\NirLauncher\NirSoft\soundvolumeview.exe” /SetDefault
“Realtek(R) Audio\Device\Speakers\Render” all
Просто запустите ярлык или вставьте целевой объект ярлыка в файл пакета.
Вот более надежный способ с использованием SoundVolumeView.exe или командной строки SoundVolumeView svcl.exe
Просто установка устройства по имени небезопасна, потому что некоторые устройства могут иметь одинаковые имена, и в этом случае NirCmd будет использовать первое из них, которое найдет в списке устройств.
Лучший способ, который я обнаружил после экспериментов с SoundVolumeView.exe, это использование опции /SetDefault
.
Вот полная команда
svcl.exe /SetDefault "Apple Audio Device\Device\Speakers\Render" all
Здесь “Apple Audio Device\Device\Speakers\Render” это мой дружественный командной строке идентификатор устройства, и вы можете получить его из списка, перечислив все устройства с помощью svcl.exe /scomma
или вы можете использовать GUI SoundVolumeView.exe и использовать дружественный командной строке идентификатор.
Другие ответы приводят различные способы изменения аудиоустройства (с помощью пакетного файла, стороннего инструмента и т.д.).
Этот ответ не предлагает еще один способ сделать это, но дает вам возможность улучшить UX этого действия.
Это небольшой скрипт для Autohotkey, который циклически переключает несколько устройств при нажатии Win + Alt + V, выполняя команду, которую вы предпочитаете для этого действия (смотрите другие ответы).
Но в дополнение после выполнения команды скрипт отображает полупрозрачное уведомление OSD в середине экрана с именем активированного аудиоустройства. Уведомление полностью неинтерактивное, поэтому оно не мешает.
Я считаю, что это гораздо лучше с точки зрения UX, когда на экране есть обратная связь, которая четко указывает, какое аудиоустройство было фактически выбрано после нажатия горячей клавиши. Особенно если та же горячая клавиша переключается между несколькими устройствами.
#Requires AutoHotkey v2.0
devices := [
'Headphones',
'Speakers'
]
#!v::{
static deviceIndex := 1
SetAudioDevice(devices[deviceIndex])
ShowNotification(devices[deviceIndex])
deviceIndex := deviceIndex < devices.Length ? deviceIndex + 1 : 1
}
SetAudioDevice(device) {
; Запустите команду, которую вы предпочитаете для переключения аудиоустройства, например:
Run 'nircmd setdefaultsounddevice "' device '"'
}
ShowNotification(device) {
static notification := unset
HideNotification()
notification := Gui(, "Переключатель звуковых устройств")
notification.Opt("+AlwaysOnTop +Disabled -Caption -SysMenu +ToolWindow +Owner +E0x20") ; https://learn.microsoft.com/en-gb/windows/win32/winmsg/extended-window-styles
notification.BackColor := "EEAA99"
notification.SetFont("s64")
notification.Add("Text", "cSilver", device)
WinSetTransColor(notification.BackColor " 150", notification)
notification.Show("NoActivate")
SetTimer(HideNotification, -2000)
HideNotification() {
if (IsSet(notification)) {
notification.Destroy()
notification := unset
}
}
}
В начале скрипта находится массив с названиями устройств. Вставьте сюда свои устройства, которые вы хотите использовать для переключения (вы можете не использовать все устройства, если хотите; например, не вставляйте сюда устройства, которые вы не используете часто).
Измените реализацию функции SetAudioDevice
для выполнения команды, которую вы предпочитаете для фактического переключения. В приведенном выше примере я использую nircmd
, но любая команда будет работать, если у нее есть название устройства в качестве входного параметра.
Поместите скрипт в %AppData%\Microsoft\Windows\Start Menu\Programs\Startup
, чтобы он запускался вместе с Windows, если желаете.
Ответ или решение
Вопрос о переключении стандартного аудиоустройства в Windows 10 с помощью пакетного файла является достаточно актуальным для пользователей, которые хотят автоматизировать работу со звуком, не прибегая к стороннему программному обеспечению. Рассмотрим более подробно теоретический аспект, практическое применение, а также предложим несколько решений, которые могут помочь в данной ситуации.
Теория
В операционной системе Windows управление аудиоустройствами осуществляется через разделы реестра и предоставленные API. Административные привилегии и структура реестра предоставляют необходимые инструменты для изменения стандартного аудиоустройства, однако, они могут стать излишне сложными для неопытного пользователя. В Windows 10 структура реестра несколько изменилась, и некоторые пути, которые использовались ранее, больше не актуальны. Например, ключи реестра, которые раньше находились в HKCU:\Software\Microsoft\Windows\CurrentVersion\Applets\Volume Control\
, в современных системах могут быть смещены или отсутствовать.
Пример
Одним из подходов к решению задачи является использование командной строки и утилит, написанных на PowerShell или сторонних инструментария, таких как NirCmd или AudioDeviceCmdlets. Основное преимущество заключается в доступе к функционалу без необходимости детального понимания изменений в реестре. Несмотря на нежелание автора использовать сторонние программы, их размер и функционал делают эти утилиты по сути встроенными расширениями.
Например, NirCmd позволяет выполнить команду:
nircmd setdefaultsounddevice "Speakers" 1
Эта команда переключает стандартное устройство на "Speakers", при этом "1" означает, что устройство будет использоваться по умолчанию для всех операций, а "2" может использоваться для устройств коммуникаций.
Применение
Для пользователей, которые предпочитают использовать только встроенные инструменты Windows, существует возможность написания более сложного сценария на PowerShell, который будет работать с реестром и API Windows для управления аудиоустройствами. Приведем в качестве примера PowerShell-скрипт, использующий AudioDeviceCmdlets:
# Переключение между двумя аудиоустройствами
$device1 = "PHILIPS"
$device2 = "Speakers"
$Audio = Get-AudioDevice -playback
Write-Output "Было выбрано аудиоустройство: " $Audio.Name
Write-Output "Устройство теперь переключено на: "
if ($Audio.Name.StartsWith($device1)) {
(Get-AudioDevice -list | Where-Object Name -like ("$device2*") | Set-AudioDevice).Name
} Else {
(Get-AudioDevice -list | Where-Object Name -like ("$device1*") | Set-AudioDevice).Name
}
Заключение
Использование PowerShell предоставляет мощь и гибкость в настройке, однако требует начальных знаний из-за особенностей работы с командлетами. Несмотря на это, создание командных файлов или PowerShell-скриптов позволяет пользователям персонализировать их опыт работы, гарантируя, что переключение аудиоустройств будет выполняться более гибко и быстро.
Дополнительным преимуществом является интеграция подобных решений с другими программами автоматизации, такими как Stream Deck или AutoHotkey, что позволяет добиться более высокого уровня комфорта и продуктивности. Подобные решения не только решают основную задачу пользователя, но и расширяют возможности оптимизации рабочего процесса, обеспечивая востребованную функциональность без компромиссов по безопасности и стабильности системы.