Bin schon seit längerem auf der Suche in AutoIT das Standardsoundausgabegerät zu ändern. Eine eingebaute Funktion scheint es ja nicht zu geben. Also müsste es doch wenigsten über die DLL möglich sein oder ein Registry-Eintrag. Mit ProcessMonitor ist es einfach zu viel herauszufinden welcher Registry das Standarsaugabegerät bestimmt.
Bin schon seit längerem auf der Suche in AutoIT das Standardsoundausgabegerät zu ändern. Eine eingebaute Funktion scheint es ja nicht zu geben. Also müsste es doch wenigsten über die DLL möglich sein oder ein Registry-Eintrag. Mit ProcessMonitor ist es einfach zu viel herauszufinden welcher Registry das Standarsaugabegerät bestimmt.
Gibt es zufällig für mmsys.cpl Parameter?
Lg likeu<3
warum arbeitest du nicht direkt über control befehle und wechselst so das ausgabegerät?
das fenster zu öffnen sollte über shellexecute ja kein problem sein. da das ganze sogar unsichtbar im hintergrund laufen kann, sollte ein unterschied kaum bemerktbar sein.
Schon, aber warum mit ControlClick unzuverlässig arbeiten wenn man mit NirCMD es alles komplett und sauber hinbekommt?
Du könntest dir mal die Dokumentation von NirCMD anschauen wie es dort gehandhabt wird das das Ausgabesystem gewechselt wird, vielleicht kannst du das ja übernehmen?
setdefaultsounddevice [Device Name] {Role}
Set the default sound device on Windows 7/Vista/2008. The [Device Name] is the name of the device, as appeared in the sound devices list of windows, for example: Speakers, Line In, Microphone, and so on...
The {Role} parameter is optional and may countain one of the following values: 0 for Console (the default value), 1 for Multimedia, and 2 for Communications.
Examples:
setdefaultsounddevice "Line In"
setdefaultsounddevice "Microphone" 2
Die Geräte bzw. die Anordnung kann sich doch ändern oder es können neue Geräte hinzugefügt werden, da ist zweifelslos NirCMD die bessere Variante.
die reihenfolge und etliche weitere details können natürlich ausgelesen werden... zur not sogar aus der registry ([HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr entVersion\MMDevices\Audio\Render\]). da es sich hierbei aber ohnehin um ein privat tool handelt (jeder pc verfügt ja über andere möglichkeiten der soundwiedergabe), ist das wohl definitiv unnötig.
wie dem auch sei... die nutzung einer fremdsoftware zur lösung eines problems sollte absolut IMMER die letzte wahl sein.
Edit:
Schaut man sich online etwas um, findet man schnell wohl beinahe perfekte lösung:
Es geht doch nur darum ein paar Geräte zu ändern, da braucht man kein so langes Script.
NirCMD funktioniert sowie ControlClick, das erste ist zuverlässiger und das 2. lässt den User nicht frei machen was er will sondern wird vom Fenster gestört, da kann sich jeder rausnehmen was er davon haben möchte.
Es geht doch nur darum ein paar Geräte zu ändern, da braucht man kein so langes Script.
NirCMD funktioniert sowie ControlClick, das erste ist zuverlässiger und das 2. lässt den User nicht frei machen was er will sondern wird vom Fenster gestört, da kann sich jeder rausnehmen was er davon haben möchte.
es geht darum das nircmd eine fremdsoftware ist...
der lange code kann natürlich auch deutlich vereinfacht werden...
bsp:
Code:
switchToDeviceByName('Lautsprecher')
;~ switchToDeviceByName('Digitalaudio (HDMI)')
Func GetAvailableDevices()
Local $array[1][2]=[[0]], $i=1, $hklm
If @OSArch='X64' Then
$hklm="HKLM64"
Else
$hklm="HKLM"
EndIf
While True
Local $var = RegEnumKey($hklm&"\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\", $i)
If @error <> 0 Or $var='' Then ExitLoop
$i+=1
If RegRead($hklm&"\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\"&$var,"DeviceState")=1 Then
$array[0][0]=$array[0][0]+1
ReDim $array[$array[0][0]+1][2]
$array[$array[0][0]][0] = RegRead($hklm&"\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\"&$var&"\Properties", "{a45c254e-df1c-4efd-8020-67d146a850e0},2")
$array[$array[0][0]][1] = "{0.0.0.00000000}."&$var
EndIf
WEnd
Return $array
EndFunc
Func switchToDeviceByID($sId)
Local $tagIPolicyConfig = "GetMixFormat hresult(wstr;ptr*);GetDeviceFormat hresult(wstr;int;ptr*);ResetDeviceFormat hresult(wstr);SetDeviceFormat hresult(wstr;ptr;ptr);GetProcessingPeriod hresult(wstr;int;int64*;int64*);SetProcessingPeriod hresult(wstr;int64*);GetShareMode hresult(wstr;ptr);SetShareMode hresult(wstr;ptr);GetPropertyValue hresult(wstr;struct;variant*);SetPropertyValue hresult(wstr;struct;variant*);SetDefaultEndpoint hresult(wstr;int);SetEndpointVisibility hresult(wstr;int);"
Local $oPolicyConfig = ObjCreateInterface("{870af99c-171d-4f9e-af0d-e63df40c2bc9}", "{f8679f50-850a-41cf-9c72-430f290290c8}", $tagIPolicyConfig)
If $oPolicyConfig.SetDefaultEndpoint($sId, 0) = 0 Then $oPolicyConfig.SetDefaultEndpoint($sId, 2)
EndFunc
Func switchToDeviceByName($name)
Local $devices = GetAvailableDevices()
For $i=1 To $devices[0][0]
If $devices[$i][0] = $name Then
switchToDeviceByID($devices[$i][1])
Return 1
EndIf
Next
EndFunc
Microsoft selber sagte sie wollen das User nichts an den Wiedergabegeräten durch Codes ändern. Und das mit der Nircmd war jetzt einfach und ich wollte ja lediglich nur 2 Verknüpfungen (bzw Batchdateien) auf dem Desktop. Kannst ja ne Include schreiben mit den Befehlen .
Der Key müsste bei jedem PC anders sein: {a45c254e-df1c-4efd-8020-67d146a850e0}
Edit: Gibts eig ein Befehl um nach zuvolziehen wer eine Datei zuletzt geändert hat ?