Standard Audiogerät setzen (Win XP + Win 7)

  • Hallo zusammen,
    wie in der Überschrift erwähnt, möchte ich das Standard Audioausgabegerät für Windows XP und Windows 7 setzen können.
    Dabei muss ich nicht zwingend die verfügbaren Geräte auslesen können, sondern ich setze dafür einfach 2-3 Konstanten. Das reicht für meine Zwecke!

    Unter XP konnte man mit dem Registry Schlüssel HKEY_CURRENT_USER\Software\Microsoft\Multimedia\Sound Mapper\Playback das Standardgerät setzen.
    Doch unter Windows 7 gibt es den Schlüssel nicht mehr.

    Weiss jemand, wie man das machen könnte?

    Ach ja: das Ausgabegerät sollte dann nicht nur für das AutoIt skript geändert sein, sondern für alle Windows Programme!

    Grüsse
    Veronesi

  • Hallo SchrotterCh,

    danke für die Antwort.
    Doch "gegooglet" habe ich schon sehr viel darüber.

    Gut ich habe vergessen zu erwähnen, dass ich es nicht über Makros (also Systemsteuerung automatisch öffnen, mit Pfeiltasten zu Sounds und Multimedia fahren, Enter drücken......) machen möchte!

    Das ganze ist dann System und Sprachabhängig. Und genau das möchte ich vermeiden. Es gibt doch bestimmt einen DLL Aufruf oder ähnliches.
    Zudem sind bei gewissen PCs die Berechtigungen eingeschränkt, so dass sie die Systemsteuerung nicht öffnen können. Sie hätten zwar die Berechtigung um z.B. das Audio zu ändern, kommen aber ohne Systemsteuerung fast nicht ran!

    Trotzdem danke!
    Gruss

  • Ach ja? Das ist aber interessant!

    Bei uns (Win 7 Business, 64-bit) gibt's den nicht.
    Aber ich kann mal versuchen, ob's läuft, wenn man den erstellt!

    Danke + Grüsse
    Veronesi

  • ich hab bei mir mal nachgeschaut Professional 32bit und ultimate 64 bit ich hab die schlüssel auch (beides windows 7

  • So, ich konnte nun auch 42 unterschiedlichen Windows 7 Rechnern nachschauen ;)

    Doch leider gibt's diesen Schlüssel auf keinem System. Und wenn ich den erstelle, reagiert der PC nicht auf diesen Schlüssel..

    Klappt das bei Euch?

    Spoiler anzeigen
    [autoit]

    Dim $RegKey = "HKEY_CURRENT_USER\Software\Microsoft\Multimedia\Sound Mapper" ;Registry Key
    Dim $ActualSettings, $OutputDevice1, $OutputDevice2

    [/autoit] [autoit][/autoit] [autoit]

    If Not FileExists(@ScriptDir & "\Swap_AudioOutput_Settings.ini") Then ;Create default INI file if no file found!
    IniWrite(@ScriptDir & "\Swap_AudioOutput_Settings.ini","Audio Output","OutputDevice1","Realtek HD Audio output")
    IniWrite(@ScriptDir & "\Swap_AudioOutput_Settings.ini","Audio Output","OutputDevice2","Realtek HD Audio output")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $OutputDevice1 = IniRead(@ScriptDir & "\Swap_AudioOutput_Settings.ini","Audio Output","OutputDevice1","Realtek HD Audio output") ;Load Device
    $OutputDevice2 = IniRead(@ScriptDir & "\Swap_AudioOutput_Settings.ini","Audio Output","OutputDevice2","Realtek HD Audio output")

    [/autoit] [autoit][/autoit] [autoit]

    $ActualSettings = RegRead($RegKey, "Playback") ;Get actual Output-Device

    [/autoit] [autoit][/autoit] [autoit]

    If $ActualSettings = $OutputDevice1 Then
    RegWrite($RegKey, "Playback", "REG_SZ", $OutputDevice2)
    Else
    RegWrite($RegKey, "Playback", "REG_SZ", $OutputDevice1)
    EndIf
    Exit

    [/autoit]

    Vielleicht geht's ja bei Euch auch nicht?
    Natürlich müsst ihr die Werte bei OutputDevice1 und OutputDevice2 anpassen auf die Namen, welche bei Euch stehen!

    Danke + Grüsse
    Veronesi

  • Sorry, dass ich das nochmal ausgrabe, aber hast du eine Lösung gefunden?
    Bzw. hat jemand anders eine Lösung?

  • Nein, leider keine direkte Lösung gefunden. Ich löste es über Tastendruck-Simulationen,...

    Ist aber leider Sprachabhängig!
    Wenn jemand eine direkte Lösung findet, nur her damit :)

  • Ich habe hier mal meine alte Lösung rausgesucht.
    Für Windows XP geht's einfacher! Dort habe ich aber einfach ein INI-File für die Settings verwendet.

    Spoiler anzeigen
    [autoit]

    #Region ;Header
    ;===============================================================================================================================
    ;Description......: Switch from one Audio Output to an other
    ;Author...........: Veronesi
    ;Date.............: 21.01.2011
    ;===============================================================================================================================
    #NoTrayIcon
    #AutoIt3Wrapper_UseX64=n
    #AutoIt3Wrapper_UseUpx=y
    #AutoIt3Wrapper_icon=S:\UE_Std\TestPC\Source\Icon.ico
    #AutoIt3Wrapper_Res_Comment=Switch from one Audio Output to an other
    #AutoIt3Wrapper_Res_Description=Switch from one Audio Output to an other
    #AutoIt3Wrapper_Res_Fileversion=1.0.0.1
    #AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
    #AutoIt3Wrapper_Res_LegalCopyright=Veronesi

    [/autoit] [autoit][/autoit] [autoit]

    Opt("MustDeclareVars", 1) ;Must declare variables
    Opt("WinWaitDelay", 100)
    OnAutoItExitRegister("_Exit") ;Create defined Exit Callback Register

    [/autoit] [autoit][/autoit] [autoit]

    #include-once
    #EndRegion ;End of Header
    ;===============================================================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    #Region ;Variables, Constants
    Dim $RegKey = "HKEY_CURRENT_USER\Software\Microsoft\Multimedia\Sound Mapper"
    Dim $ActualSettings, $OutputDevice1, $OutputDevice2, $Status
    #EndRegion ;End of Variables, Constants
    ;===============================================================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    #Region ;Main
    If @OSVersion = "WIN_XP" Then
    If Not FileExists(@ScriptDir & "\Swap_AudioOutput_Settings.ini") Then
    IniWrite(@ScriptDir & "\Swap_AudioOutput_Settings.ini","Audio Output","OutputDevice1","Realtek HD Audio output")
    IniWrite(@ScriptDir & "\Swap_AudioOutput_Settings.ini","Audio Output","OutputDevice2","Realtek HD Audio output")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $OutputDevice1 = IniRead(@ScriptDir & "\Swap_AudioOutput_Settings.ini","Audio Output","OutputDevice1","Realtek HD Audio output")
    $OutputDevice2 = IniRead(@ScriptDir & "\Swap_AudioOutput_Settings.ini","Audio Output","OutputDevice2","Realtek HD Audio output")

    [/autoit] [autoit][/autoit] [autoit]

    $ActualSettings = RegRead($RegKey, "Playback")

    [/autoit] [autoit][/autoit] [autoit]

    If $ActualSettings = $OutputDevice1 Then
    RegWrite($RegKey, "Playback", "REG_SZ", $OutputDevice2)
    Else
    RegWrite($RegKey, "Playback", "REG_SZ", $OutputDevice1)
    EndIf
    Else
    ShellExecute("mmsys.cpl") ;Start Sound switcher control
    WinWait("Sound", "", 10000) ;Wait max. 10s for this window
    WinActivate("Sound") ;Activate window
    Send("{Down}") ;Activate first entry
    $Status = ControlCommand("Sound", "", "[CLASS:Button; INSTANCE:2]", "IsEnabled", "") ;Check status of the button "Als Standard". If = 1 then the button is NOT deactivated!
    If Not $Status Then Send("{Down}") ;If the first entry is set as default, then take the second
    ControlClick("Sound", "", "[CLASS:Button; INSTANCE:2]")
    ControlClick("Sound", "", "[CLASS:Button; INSTANCE:4]")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _Exit()
    #EndRegion ;End of Main
    ;===============================================================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    #Region ;Functions
    Func _Exit()
    Exit
    EndFunc ;==>_Exit
    #EndRegion ;End of Functions

    [/autoit]


    Gruss Veronesi

  • Also,ich habe bei mir mal ein Soundproblem gehabt und da kamm das Fenster:Allgemeine Windows-Shell reagiert nicht.Unter Modul stand dann shell32.dll.E.v kannst du es ja mit der shell32.dll ansprechen?

  • Hallo veronesi!

    Unter XP konnte man mit dem Registry Schlüssel HKEY_CURRENT_USER\Software\Microsoft\Multimedia\Sound Mapper\Playback das Standardgerät setzen.


    Unter Win7 existiert dieser Pfad nur teilweise. Hier am Laptop habe ich ihn nicht, am Stand PC im Büro habe ich ihn.

    Audio Devices werden in Win7 unter

    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVerison\MMDevices\Audio\Render

    verwaltet. Einen Wert für ein Standardaudiogerät konnte ich allerdings nicht finden. Liegt vielleicht auch daran, dass ich nur 1 Audiogerät habe, welches automatisch standard ist. Die Namen der Devices unter Render ist sinnfrei und dürfte von Audiogerät zu Audiogerät verschieden sein.

    Willst du dein Vorhaben über einen DLL Call realisieren, ist wohl die winmm.dll die richtige.
    Funktionsliste der winmm.dll auf MSDN

    Hoffe ich konnte ein wenig helfen.
    Gruß Paul

  • Danke!
    Ich kenn mich leider nicht mit DLL's aus.
    Vielleicht schaut hier gleich mal ein Profi rein.
    Denn es nervt echt, wenn ich immer per Hand von Headset auf PC-Boxen "switchen" muss.

  • Ich habe noch keine Funktion gefunden, um das Audiogerät zu ändern. Dazu musst du schon die Systemsteuerung automatisieren.

  • Wenn ich die Zeit hätte, würde ich dem näher auf den Grund gehen. Muss wohl das WE herhalten.

    Bin gerade auf devcon gestoßen. Müßte doch auch gehen, oder?

    devcon auf support.microsoft.com


    devcon disable <your-sound-card-HardwareID>

    Das WE wird es enthüllen.

  • Ich hab momentan nur diese Lösung:

    Spoiler anzeigen
    [autoit]

    Func _SetAudioDevice($sChange, $iAudio = 0)
    ; 0 = Playback
    ; 1 = Record
    Local $iAudioCount, $sName, $sDefault, $ID = -1
    Local $fDefault = False, $fConfigure = False
    Run("control.exe mmsys.cpl")
    WinWait("Sound")
    If $iAudio = 1 Then
    ControlCommand("Sound", "", "[CLASS:SysTabControl32; INSTANCE:1]", "TabRight")
    Sleep(200)
    EndIf
    $iAudioCount = ControlListView("Sound", "", "[CLASS:SysListView32; INSTANCE:1; ID:1000]", "GetItemCount")
    For $i = 0 To $iAudioCount - 1
    $sName = ControlListView("Sound", "", "[CLASS:SysListView32; INSTANCE:1; ID:1000]", "GetText", $i, 1)
    ControlListView("Sound", "", "[CLASS:SysListView32; INSTANCE:1; ID:1000]", "Select", $i)
    $fConfigure = ControlCommand("Sound", "", "[CLASS:Button; INSTANCE:1; ID:1001]", "IsEnabled")
    $fDefault = ControlCommand("Sound", "", "[CLASS:Button; INSTANCE:2; ID:1002]", "IsEnabled")
    Switch $iAudio
    Case 0
    If ($sName = $sChange) And $fDefault And $fConfigure Then
    $ID = $i
    ExitLoop
    EndIf
    Case 1
    If ($sName = $sChange) And $fDefault Then
    $ID = $i
    ExitLoop
    EndIf
    EndSwitch
    Next
    ControlListView("Sound", "", "[CLASS:SysListView32; INSTANCE:1; ID:1000]", "Select", $ID)
    ControlClick("Sound", "", "[CLASS:Button; INSTANCE:2; ID:1002]")
    WinClose("Sound")
    If $ID <> -1 Then
    Return 1
    Else
    Return 0
    EndIf
    EndFunc ;==>_SetAudioDevice

    [/autoit]

    $sChange ist der Name des Audiogerätes, welches gesetzt werden soll.