本文目录导读:

获取系统音效方案(即当前系统使用的声音主题或声音方案)的方法强烈依赖操作系统,最常用的场景是 Windows,因为它有经典的控制面板声音方案,macOS 和 Linux 在此方面的定义和获取方式则大不相同。
以下是针对不同操作系统的脚本方法:
Windows (最常用)
Windows 将当前声音方案信息存储在注册表中,你可以通过 PowerShell 或 CMD 脚本来读取。
方法 A:使用 PowerShell (推荐)
这个脚本可以获取当前使用的声音方案名称。
# 获取当前声音方案的注册表值
$schemeKey = "HKCU:\AppEvents\Schemes"
$currentSchemeGUID = (Get-ItemProperty -Path "HKCU:\AppEvents\Schemes" -Name "(Default)" -ErrorAction SilentlyContinue).'(Default)'
if ($currentSchemeGUID) {
# 根据GUID查找方案名称
$schemeNamePath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\SoundScheme"
# 方案名称通常在 HKCU 下的子键中,或者通过 (Default) 值查找
# 更精确的方法:在 HKCU:\AppEvents\Schemes 下,每个子键代表一个方案,其 (Default) 值就是名称
$schemeNames = Get-ChildItem -Path "HKCU:\AppEvents\Schemes" | Where-Object { $_.PSChildName -ne "Apps" }
$currentSchemeName = $null
foreach ($scheme in $schemeNames) {
$schemeGUID = $scheme.PSChildName
if ($schemeGUID -eq $currentSchemeGUID) {
$currentSchemeName = (Get-ItemProperty -Path $scheme.PSPath -Name "(Default)" -ErrorAction SilentlyContinue).'(Default)'
break
}
}
if (-not $currentSchemeName) {
# 如果找不到友好名称,则显示原始GUID
$currentSchemeName = $currentSchemeGUID
}
Write-Host "当前系统声音方案: $currentSchemeName"
} else {
Write-Host "无法获取当前声音方案信息。"
}
# 可选:列出所有可用的声音方案
# Get-ChildItem -Path "HKCU:\AppEvents\Schemes" | Where-Object { $_.PSChildName -ne "Apps" } | ForEach-Object { Write-Host $_.PSChildName }
解释:
- Windows 使用 GUID (如
{.e17..}) 来标识声音方案。 - 当前激活的方案的 GUID 存储在
HKCU:\AppEvents\Schemes的默认值中。 - 你可以在
HKCU:\AppEvents\Schemes下找到所有已安装的方案,每个子键的(Default)值就是方案名称(如 "Windows Default"、"无声")。
方法 B:使用 CMD (批处理)
CMD 对注册表的处理能力较弱,但可以配合 reg query 实现。
@echo off
setlocal enabledelayedexpansion
:: 获取当前声音方案的GUID
for /f "tokens=3" %%a in ('reg query "HKCU\AppEvents\Schemes" /ve 2^>nul') do set "scheme_guid=%%a"
:: 如果找不到,尝试查找默认方案
if "%scheme_guid%"=="" (
for /f "tokens=3" %%a in ('reg query "HKCU\AppEvents\Schemes" /v "(Default)" 2^>nul') do set "scheme_guid=%%a"
)
if defined scheme_guid (
echo 当前声音方案GUID: %scheme_guid%
:: 尝试获取友好名称 (直接在 Schemes 下查找)
for /f "tokens=1,* delims=\" %%i in ('reg query "HKCU\AppEvents\Schemes" 2^>nul') do (
set "key_path=%%i\%%j"
set "guid_only=%%j"
if "!guid_only!"=="!scheme_guid!" (
for /f "tokens=3" %%n in ('reg query "HKCU\AppEvents\Schemes\!scheme_guid!" /ve 2^>nul') do (
echo 方案名称: %%n
)
)
)
) else (
echo 无法获取声音方案。
)
endlocal
pause
macOS (macOS 声音主题)
macOS 没有像 Windows 那样的“声音方案”概念,它主要使用独立的系统声音设置。
你可以获取的信息:
-
当前选中的“提示音”:
# 获取当前系统提示音 (Alert Sound) 的名称 defaults read NSGlobalDomain com.apple.sound.beep.sound # 通常输出类似: "/System/Library/Sounds/Funk.aiff"
这个命令会返回一个路径,而不是一个“方案”,这个声音是固定的,没有“方案”切换。
-
获取所有可用系统音效列表:
ls /System/Library/Sounds/
为什么 macOS 没有“声音方案”? macOS 的设计是用户单独选择登录项音效、通知音效、邮件音效等,而不是一个预定义的声音集合(方案),所以没有直接的“声音方案”概念。
Linux (基于 PulseAudio/PipeWire)
Linux 桌面环境通常使用 PulseAudio 或 PipeWire,并且声音方案取决于桌面环境设置。
方法 A:获取 PulseAudio 的默认输出/输入 (不是“方案”)
# 获取默认的音频输出端口 pactl get-default-sink # 获取默认的音频输入端口 pactl get-default-source # 获取所有音频端口的状态 pactl list sinks short
方法 B:获取桌面环境的声音主题 (如果存在)
某些桌面环境(如 GNOME、KDE)有自己的声音主题设置,但这些设置储存在桌面环境的配置文件中(通常是 dconf 或配置文件)。
GNOME:
# 获取当前 sound theme (如果设置了) gsettings get org.gnome.desktop.sound theme-name # 输出可能是: 'freedesktop' 或 'your-custom-theme'
KDE Plasma:
KDE 的声音方案通常存储在 ~/.config/ 下的配置文件中,格式复杂,通常需要通过 kwriteconfig5 或直接解析 ~/.config/baloofilerc 等文件。
Web 浏览器 (JavaScript)
在网页中,你不能“获取系统声音方案”,这是出于安全限制,浏览器无法直接访问操作系统级别的设置或文件系统。
你能做的:
- 使用 Web Audio API 获取音频输出设备信息,但能获取的是输出设备的名称(如 “扬声器 (Realtek Audio)”),而不是“声音方案”。
- 使用
navigator.mediaDevices.enumerateDevices()可以列出音频设备,但没有声音方案信息。
示例:列出音频设备
navigator.mediaDevices.enumerateDevices()
.then(devices => {
devices.forEach(device => {
if (device.kind === 'audiooutput') {
console.log('音频输出设备:', device.label);
}
});
});
| 操作系统 | 最佳方法 | 核心命令/技术 |
|---|---|---|
| Windows | PowerShell | Get-ItemProperty HKCU:\AppEvents\Schemes |
| macOS | Terminal | defaults read NSGlobalDomain com.apple.sound.beep.sound |
| Linux (GNOME) | Terminal | gsettings get org.gnome.desktop.sound theme-name |
| Web 浏览器 | 受限 | navigator.mediaDevices.enumerateDevices() (只能获取设备名) |
建议:
如果你需要的是一个跨平台的解决方案,建议根据 process.platform (Node.js) 或 $OSType (PowerShell) 检测操作系统,然后分别调用对应的命令,直接获取“声音方案”在非 Windows 平台上通常无法得到一个简单的字符串结果。