3

У меня есть два основных аудиовыхода на моей машине: динамики и USB-гарнитура. В настоящее время в Windows 7 Professional x64 я набираю "звук" в меню "Начать поиск", чтобы открыть это диалоговое окно:

Windows 7 Sound Dialog

Я забочусь только о двух лучших вариантах для целей этого вопроса. Я хотел бы знать, есть ли способ в AutoHotKey переключиться с «Динамики (4-головная USB-гарнитура Sennheiser)» на «Динамики (VIA High Definition Audio)», чтобы избежать необходимости открывать это диалоговое окно каждый раз, когда я хочу переключиться. Спасибо!

3 ответа3

4

Я нашел ответ благодаря помощи 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, чтобы убедиться в этом!). Остальные команды имеют дело с обработкой пользовательского интерфейса, от выбора правильной части окна до симуляции "щелчков", до нажатия "Установить значение по умолчанию" (должно соответствовать вашему текущему языку) до нажатия "ОК" (то же самое).

При запуске вы заметите, что окно физически всплывает на полсекунды, поскольку оно физически проходит и выбирает все. Хотя я бы предпочел вариант без окон, он работает нормально, так как фокус возвращается к правильному окну (даже в полноэкранных играх) после его запуска.

0

Вот решение, которое проходит через все аудиоустройства и исключает те, которые вам не нужны, например, 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

0

Я только что подправил сценарий "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

Измените текст во всех заглавных буквах на имя звукового окна и название кнопки "Установить по умолчанию". Держать "!&»

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .