Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > AutoIt
You last visited: Today at 17:24

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



AutoIT Wiedergabegerät ändern

Discussion on AutoIT Wiedergabegerät ändern within the AutoIt forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: May 2011
Posts: 32
Received Thanks: 2
Question 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
LikeU<3 is offline  
Old 11/12/2013, 19:05   #2
 
alpines's Avatar
 
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.
alpines is offline  
Thanks
1 User
Old 11/12/2013, 19:14   #3
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
Quote:
Originally Posted by LikeU<3 View Post
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.
lolkop is offline  
Old 11/12/2013, 19:18   #4
 
alpines's Avatar
 
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?
alpines is offline  
Thanks
1 User
Old 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
LikeU<3 is offline  
Old 11/12/2013, 20:14   #6
 
lolkop's Avatar
 
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...
lolkop is offline  
Old 11/12/2013, 20:21   #7
 
alpines's Avatar
 
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.
alpines is offline  
Old 11/12/2013, 20:35   #8
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
Quote:
Originally Posted by alpines View Post
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:
lolkop is offline  
Old 11/12/2013, 20:57   #9
 
alpines's Avatar
 
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.
alpines is offline  
Old 11/12/2013, 21:47   #10
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
Quote:
Originally Posted by alpines View Post
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
lolkop is offline  
Thanks
1 User
Old 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 ?
LikeU<3 is offline  
Reply




All times are GMT +2. The time now is 17:25.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.