使用 AutoHotKey 更改音频输出源?

使用 AutoHotKey 更改音频输出源?

我的机器上有两个主要音频输出:扬声器和 USB 耳机。目前,在 Windows 7 Professional x64 中,我在“开始”搜索菜单中键入“声音”以打开此对话框:

Windows 7 声音对话框

就这个问题而言,我只关心前两个选项。我想知道 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

相关内容