我的机器上有两个主要音频输出:扬声器和 USB 耳机。目前,在 Windows 7 Professional x64 中,我在“开始”搜索菜单中键入“声音”以打开此对话框:
就这个问题而言,我只关心前两个选项。我想知道 AutoHotKey 中是否有办法从“扬声器(4- Sennheiser USB 耳机)”切换到“扬声器(VIA 高清音频)”,这样我就可以避免每次想要切换时都要打开这个对话框。谢谢!
答案1
感谢 iglvzx 的帮助,指出了正确的术语,我找到了答案!
; Toggles default audio device in Control Panel (switches between headset and speakers).
ScrollLock::
toggle:=!toggle ;toggles up and down states.
Run, mmsys.cpl
WinWait,Sound
if toggle
ControlSend,SysListView321,{Down 1}
Else
ControlSend,SysListView321,{Down 2}
ControlClick,&Set Default
ControlClick,OK
return
ScrollLock
是我按下的键。toggle
是 AutoHotKey 保存的一个变量(据我所知),下面的条件会使用它。mmsys.cpl
是上图所示的窗口(在 Run 中输入它,亲自查看!)。其余命令处理 UI,从选择窗口的正确部分到模拟“点击”到单击“设置默认值”(必须与您当前的语言匹配)再到单击“确定”(同上)。
运行此程序时,您会注意到窗口会弹出半秒钟,因为它会实际运行并选择所有内容。虽然我更喜欢无窗口选项,但这个选项运行良好,因为运行后焦点会返回到正确的窗口(甚至是全屏游戏)。
答案2
我刚刚修改了“aafe”的脚本。它适用于多个输出并循环播放:
; Audio Output Default cycle
ScrollLock::
Run,mmsys.cpl
WinWait,YOURSOUNDWINDOWNAME
loop,20 ; Exits loop after 20 runs. Good if there's just one output.
{
ControlSend,SysListView321,{Down}
ControlGet,isEnabled,Enabled,,&YOURSETDEFAULTBUTTONNAME
if(!isEnabled)
{
break
}
}
ControlSend,SysListView321,{Down}
ControlGet, isEnabled, Enabled,, &YOURSETDEFAULTBUTTONNAME
if(!isEnabled)
{
ControlSend,SysListView321,{Home}
}
ControlClick,&YOURSETDEFAULTBUTTONNAME
ControlClick,OK
WinWaitClose
SoundPlay, *-1
return
将大写文本更改为声音窗口的名称和“设置默认”按钮的名称。保留“!&”
答案3
这里有一个解决方案,它循环遍历所有音频设备并排除您不想要的设备,例如使用 Windows 键 + Shift + W 的 S/PDIF 或数字输出。
#+w::
IfWinExist Sound
{
WinKill Sound
}
Run rundll32.exe shell32.dll`,Control_RunDLL mmsys.cpl`,`,0
WinWait,Sound
IfWinNotActive,Sound WinActivate,Sound
WinWaitActive,Sound
ControlSend,SysListView321,{Home}
x := 1
totalDevicesCount := 0
isSecondLoop := false
isEnabled := false
; ControlGet, isEnabled, Enabled,,&Set Default
ControlGet, totalDevicesCount, List, Count, SysListView321
; isEnabled AND
StringCaseSense Off
loop
{
ControlGet, Current, List, Selected, SysListView321
if(InStr(Current, "default device") OR x > totalDevicesCount)
{
break
}
x := x + 1
ControlSend,SysListView321,{Down}
}
if (x >= totalDevicesCount)
{
ControlSend,SysListView321,{Home}
x := 1
}
loop
{
ControlGet, Current, List, Selected, SysListView321
ControlGet, isEnabled, Enabled,,&Set Default
; msgbox %x% %isEnabled% %Current%
; exclude output option with the name specified
if(InStr(Current, "Realtek Digital Output"))
{
isEnabled := false
}
if (x >= totalDevicesCount AND not isEnabled)
{
ControlSend,SysListView321,{Home}
x := 1
isSecondLoop := true
; msgbox breaking now %x% %totalDevicesCount% %isEnabled% %isSecondLoop%
break
}
if (x > totalDevicesCount OR isEnabled)
{
; msgbox breaking now %x% %totalDevicesCount% %isEnabled% %isSecondLoop%
break
}
if (x >= totalDevicesCount AND isSecondLoop)
{
; infinite loop breaker if no devices avaliable
; msgbox breaking sec %x% %totalDevicesCount% %isEnabled% %isSecondLoop%
break
}
ControlSend,SysListView321,{Down}
x := x + 1
}
;ControlGet, Current, List, Selected, SysListView321
;msgbox %Current%
Sleep 100
ControlClick,&Set Default
ControlClick,OK
; SoundPlay *48
WinKill Sound
return
我修改了论坛上 dan112123 发布的这个脚本: http://www.autohotkey.com/board/topic/2306-changing-default-audio-device/page-4