Вот решение, которое проходит через все аудиоустройства и исключает те, которые вам не нужны, например, S/PDIF или Цифровой выход с помощью Windows Key + Shift + W.
#+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