来源说明:本文参考 ahkscript 维护的 VistaAudio 项目、Vista Audio Control Function Reference 文档整理。原库作者为 Lexikos。本站已有一些 VA 音频控制示例,这篇主要作为总览:告诉你 VistaAudio 能控制什么、函数怎么选、常见坑在哪里。
VistaAudio 常见文件名是 VA.ahk,它封装的是 Windows Vista 以后引入的 Core Audio 接口。用它可以控制默认播放设备音量、静音状态、录音设备音量、音频设备名称、音频峰值表、默认音频输出设备,以及更底层的音频会话接口。
一、它和 SoundSet / SoundGet 有什么区别
AHKv1 自带 SoundSet、SoundGet,但它们在现代 Windows 上有不少限制。VistaAudio 的优势是直接面向 Core Audio API,能覆盖更多 Vista 以后系统里的音频控制能力。
简单理解:
- 只想临时调系统音量:自带命令可能够用。
- 要稳定控制默认播放/录音设备:用 VistaAudio 更合适。
- 要获取音频峰值、判断电脑是否正在发声:用
VA_GetAudioMeter相关接口。 - 要切换默认输出设备:用
VA_SetDefaultEndpoint,但要注意它依赖未公开接口。 - 要控制指定程序音量:通常要用音频会话相关接口,复杂度会高一些。
二、最常用:获取和设置主音量
默认情况下,VA_GetMasterVolume() 和 VA_SetMasterVolume() 操作的是默认播放设备。返回和设置的音量范围是 0.0 到 100.0。
#Requires AutoHotkey v1.1 #NoEnv #SingleInstance Force #Include %A_ScriptDir%\VA.ahk volume := VA_GetMasterVolume() MsgBox, % "当前默认播放设备音量:" Round(volume, 1) VA_SetMasterVolume(30) return
如果要分别读取左右声道,可以传入声道序号。声道从 1 开始,不是从 0 开始。
Loop % VA_GetMasterChannelCount()
{
msg .= "声道 " A_Index ": " VA_GetMasterVolume(A_Index) "`n"
}
MsgBox, % msg
三、静音和取消静音
静音状态使用 VA_GetMasterMute() 和 VA_SetMasterMute()。返回值为真表示已静音。
isMute := VA_GetMasterMute() VA_SetMasterMute(!isMute) ToolTip, % isMute ? "已取消静音" : "已静音" SetTimer, HideTip, -1000 return HideTip: ToolTip return
这类脚本很适合绑定到热键、鼠标侧键、托盘菜单、键盘旋钮,也适合做成一个小型音量面板。
四、播放设备和录音设备怎么指定
很多 VistaAudio 函数都有 device_desc 参数。文档里给出的形式包括:
playback:默认播放设备。capture:默认录音设备。playback:1:第一个播放设备。nvidia:2:名称包含 nvidia 的第二个设备。- 设备 ID 或设备指针。
playbackVol := VA_GetMasterVolume("", "playback")
captureVol := VA_GetMasterVolume("", "capture")
lineoutVol := VA_GetMasterVolume("", "Line Out")
MsgBox, % "播放设备:" playbackVol
. "`n录音设备:" captureVol
. "`nLine Out:" lineoutVol
注意,设备名称和声卡驱动、系统语言、蓝牙设备名称有关,不同电脑上不一定一样。写给别人用的脚本,最好先枚举设备或提供配置项,不要把自己的设备名写死。
五、判断电脑是否正在发声
VA_GetAudioMeter() 可以拿到音频峰值接口,用来读取当前播放或录音设备的峰值。站内已有相关示例,这里给出最小思路:循环取峰值,峰值大于某个阈值就认为正在发声。
audioMeter := VA_GetAudioMeter()
Loop
{
VA_IAudioMeterInformation_GetPeakValue(audioMeter, peakValue)
ToolTip, % "当前峰值:" Round(peakValue, 3)
Sleep, 100
}
这类脚本可以用于“电脑有声音时不执行某动作”“检测视频是否还在播放”“做一个简易音量电平条”。不过要记住,峰值是瞬时值,实际判断最好连续采样几次,而不是只看某一瞬间。
六、切换默认音频设备
VA_SetDefaultEndpoint(device_desc, role) 可以设置默认音频端点。文档里说明角色值有三个:
0:eConsole,也就是 Windows 里常说的默认设备。1:eMultimedia。2:eCommunications,也就是默认通信设备。
; 将名称中包含 Speakers 的设备设为默认播放设备
VA_SetDefaultEndpoint("Speakers", 0)
; 将名称中包含 Headset 的设备设为默认通信设备
VA_SetDefaultEndpoint("Headset", 2)
这个函数很实用,但文档也提醒:它依赖未公开接口,所以不能保证所有系统版本都稳定可用。做正式工具时,最好给用户保留手动选择和失败提示。
七、控制子单元:麦克风、Line In 等
VA_GetVolume、VA_SetVolume、VA_GetMute、VA_SetMute 面向的是设备里的 subunit,也就是子单元。例如 Line、Line In、Mic 等。这里的名称非常依赖声卡驱动,不同机器差异很大。
lineInVol := VA_GetVolume("Line")
micMute := VA_GetMute("Mic", "capture")
MsgBox, % "Line 音量:" lineInVol "`nMic 是否静音:" micMute
如果查不到,不一定是脚本错了,可能是目标设备没有暴露这个名字,或者驱动把它叫成了别的名称。先枚举设备和子单元,再写控制逻辑,会比直接猜名字稳。
八、接口指针要释放
VistaAudio 的高级函数可能返回 COM 接口指针,例如 VA_GetAudioEndpointVolume、VA_GetAudioMeter、VA_GetDevice。文档里多次提醒:不再使用时要 ObjRelease(pointer)。
device := VA_GetDevice("playback")
name := VA_GetDeviceName(device)
MsgBox, % "默认播放设备:" name
ObjRelease(device)
短脚本偶尔忘记释放不一定马上出事,但常驻脚本、循环检测、音频面板这类工具最好养成释放习惯。
九、常见坑
- 设备名不要写死,蓝牙耳机、显示器音频、虚拟声卡名称经常变化。
- 录音设备用
capture,播放设备用playback,不要混用。 - 音量范围是
0.0到100.0,不是 0 到 1。 - 峰值检测需要连续采样,不要只看一次。
VA_SetDefaultEndpoint很方便,但底层不是正式公开 API,失败时要有提示。- 高级接口返回指针时,记得
ObjRelease。
站内延伸
总的来说,VistaAudio 最适合做“系统音频控制层”的脚本:调音量、静音、检测发声、切换设备、读取设备信息。它不是播放音乐的库,也不是音频处理库,而是帮 AHK 操作 Windows 音频设备和音频接口。

评论(0)