使用批处理文件切换默认音频设备

使用批处理文件切换默认音频设备

我正在尝试在 Windows 10 上编写一个批处理文件,以便我在运行时在耳机和扬声器之间切换为默认音频设备。我不想使用任何第三方软件。

我尝试搜索,但只找到了似乎不起作用的旧脚本,并且还引用了HKCU:\Software\Microsoft\Windows\CurrentVersion\Applets\Volume Control\似乎不再存在的路径。我在 Windows 10 注册表中找不到有关此问题的任何信息,而且如果我不确定自己在做什么,我也不太愿意过多地摆弄注册表。

答案1

我知道你不想使用任何第三方软件,但如果你不介意使用~100kb 的 exe,你可以使用尼科姆使用以下命令:

nircmd setdefaultsounddevice "Speakers" 1

或者

nircmd setdefaultsounddevice "Headphones" 1

您需要确保使用下面列出的音频设备的准确名称Playback Devices(右键单击系统托盘中的声音控件)。将它们重命名Properties为更简单的名称可能会更容易,尤其是当名称发生任何冲突时。

1命令末尾的 表示“默认设备”。使用表示2“默认通信设备”。


如果您真的不想使用第三方工具,这里有一个注册表项的差异,当我更改默认声音设备时,它似乎会发生变化,它可能对您有用,但我不知道它到底在做什么。它似乎不像 1 或 0 那样简单地表示它是否是默认的。

在此处输入图片描述

答案2

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 device was " $Audio.Name
Write-Output "Audio device now set to " 

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

您还可以找到许多解决方案来为此附加快捷键。

答案3

自 Windows 8(或者更早?)以来,PC 的音频配置存储在 中HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render。下面Render有 GUID 命名的键,每个键DeviceState在根目录下包含 dword 值。但它是如何编码的?

MSDN 上的 DEVICE_STATE_XXX 常量

  • 1 活跃
  • 2 残障人士
  • 4 不存在
  • 8 不插电

因此,在 1 和 2 之间切换的 powershell/bat 脚本应该可以解决问题。

编辑:要获取人类可读的设备名称,请阅读子{b3f8fa53-0004-438e-9003-51a46e139bfc},6Properties

答案4

更可靠的 AudioDevice 命令行解决方案。https://github.com/frgnca/AudioDeviceCmdlets

感谢@pgr 的原始答案。

对于语言本地化来说,使用 ID 代替名称更为可靠。

$Audio = Get-AudioDevice -playback
Write-Output "Audio device was " $Audio.Name
Write-Output "Audio device now set to " 

if ($Audio.Index -EQ 1) {
   (Get-AudioDevice -list | Where-Object Index -EQ 2 | Set-AudioDevice).Name
}  Else {
   (Get-AudioDevice -list | Where-Object Index -EQ 1 | Set-AudioDevice).Name
}

相关内容