|
You last visited: Today at 17:24
Advertisement
AutoIT Wiedergabegerät ändern
Discussion on AutoIT Wiedergabegerät ändern within the AutoIt forum part of the Coders Den category.
11/12/2013, 18:15
|
#1
|
elite*gold: 0
Join Date: May 2011
Posts: 32
Received Thanks: 2
|
AutoIT Wiedergabegerät ändern
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
|
|
|
11/12/2013, 19:05
|
#2
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
Du könntest versuchen dir NirCMD herunterzuladen und dann das per Run und den Parametern auszuführen, wäre eine Möglichkeit.
|
|
|
11/12/2013, 19:14
|
#3
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by LikeU<3
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.
|
|
|
11/12/2013, 19:18
|
#4
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
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?
|
|
|
11/12/2013, 19:37
|
#5
|
elite*gold: 0
Join Date: May 2011
Posts: 32
Received Thanks: 2
|
Controlsend ist net das Wahre.
Quote:
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
|
Klappt perfect und zuverlässig Thanks
|
|
|
11/12/2013, 20:14
|
#6
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
seit wann sind control funktionen unsicher? o0
ein code wie dieser:
Code:
SetDefaultDevice(2)
Func SetDefaultDevice($nr)
ShellExecute('mmsys.cpl')
Local $hwnd = WinWait('Sound')
For $i=1 To $nr
ControlSend($hwnd, '', 1000, '{down}')
Next
ControlClick($hwnd, '', 1002, 'left', 1)
WinKill($hwnd)
EndFunc
sollte immer sauber funktionieren und kommt dabei komplett ohne anderweitige software aus...
|
|
|
11/12/2013, 20:21
|
#7
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
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.
|
|
|
11/12/2013, 20:35
|
#8
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by alpines
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:
|
|
|
11/12/2013, 20:57
|
#9
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
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.
|
|
|
11/12/2013, 21:47
|
#10
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by alpines
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
|
|
|
11/12/2013, 22:05
|
#11
|
elite*gold: 0
Join Date: May 2011
Posts: 32
Received Thanks: 2
|
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 ?
|
|
|
All times are GMT +2. The time now is 17:25.
|
|