Audiogerät über Button switchen

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Sora-MMK
Posts: 10
Joined: 25 Jan 2018, 12:59
Location: Germany
Contact:

Audiogerät über Button switchen

26 Feb 2018, 09:04

Hallo Community,

Bin letztens auf den Thread "Wiedergabegeräte wechseln" und die Antwort von LuckyJoe gestoßen und wollte den, mittlerweile knapp ein Jahr alten Thread, nicht unbedingt ausgraben. Deswegen dachte ich erst, ich frage LuckyJoe einmal persönlich. Da er aber Arbeitstechnisch nicht viel zeit hat wende ich mich nun noch einmal an euch :)

Ich habe Versucht, das Script selber zu verstehen, um eventuell eine eigene Lösung dafür zu finden, aber Fehlanzeige.
Vorneweg (Und auch nur so taucht der Fehler erst auf), ich habe ein Programm gebastelt was mir vieles am PC leichter macht, z.B mit Buttons.
So habe ich auch dieses Script auf einen Button gelegt in meinem Programm.

Der relevante Scriptteil müsste wohl dieser sein:

Code: Select all

#SingleInstance Force

Gui +Caption
Gui, Font,

	Gui, Add, Button, y130 x15 w190 h40 gAudio, Audio ;Bitte ignoriert die Formatierung, die gehört zum großen ganzen^^

Gui, Font, norm
Gui, Show,
return

Guiclose:
	exitapp

Audio:
Run, RunDll32.exe shell32.dll`,Control_RunDLL mmsys.cpl`,`,0
WinActivate, Sound
WinWaitActive, Sound,, 2
if ErrorLevel
{
	MsgBox, Sound Window nicht gefunden!
	Return
}

Sleep 1000

; Das gewünschte Gerät eintragen:
MySoundGeraet = Lautsprecher

ControlGet, Liste, List,, SysListView321, Sound
Loop, Parse, Liste, `n 
{
    GeraetNr := A_Index
    Loop, Parse, A_LoopField, %A_Tab% 
		If A_LoopField = %MySoundGeraet%
		{
			Geraet = %A_Index%
			Gefunden = True
			Break
		}
	If Gefunden
		Break
}

ControlSend, SysListView321, {DOWN %GeraetNr%}, Sound
ControlSend, Button2, {Space}, Sound
WinClose, Sound
Return
Ich habe bei

Code: Select all

; Das gewünschte Gerät eintragen:
; MySoundGeraet = Logitech G430 Gaming Headset
MySoundGeraet = Realtek High Definition Audio
Mein Headset eingetragen, was laut Windows nur als "Lautsprecher" erkannt wird. Habe hier auch High Definition Audio-Gerät ausprobiert, macht kein Unterschied. Sollte ich den Button nun drücken, wird auf headset gewechselt und bei erneutem drücken wieder auf meine Boxen. Erstmal gut.
Bei jedem weiteren drücken des Buttons werden aber leider nur noch meine Boxen ausgewählt (die an erster Stelle sind).

Ich habe gelesen, dass im Originalscript nur das erste Gerät gefunden werden soll, aber nicht verstanden wie ich aus dieser Info nun erreiche dass es weiterhin hin und her wechselt.

Bei einem Neustart des Programms geht es direkt wieder einmalig, also denke ich es geht um eine Variable (A_Index?) die erst mit neustart resettet wird?

Ein weiteres Problem:
Wenn ich bei Programmstart bereits auf dem Headset bin, wählt er zuerst nochmal dieses aus und erst beim zweiten mal wählt es die Boxen aus (Und versteift sich dann auf diesen).

Und da das ja noch nicht genug geflenne ist, ist es möglich dass nur das Standartgerät und nicht das Standartkommunikationsgerät gewechselt wird? Das hätte ich gerne immer auf meinem headset, egal wo der andere Sound ist. =)

Ich hoffe mir kann da wer weiterhelfen =)

Grüße,
Sora-MMK


Betreff: Wiedergabegeräte wechseln
LuckyJoe wrote:Hallo

@just me: das ist ja wieder ein toller Ansatz. Ich habe ihn noch etwas ergänzt und erläutert. So kann ich jetzt bei mir z.B. zwischen Lautsprecher und Headset umschalten:

Code: Select all

Run, RunDll32.exe shell32.dll`,Control_RunDLL mmsys.cpl`,`,0
WinActivate, Sound
WinWaitActive, Sound,, 2
if ErrorLevel
{
	MsgBox, Sound Window nicht gefunden!
	Return
}

Sleep 1000

; Das gewünschte Gerät eintragen:
; MySoundGeraet = Logitech G430 Gaming Headset
MySoundGeraet = Realtek High Definition Audio

; Für das Weitere: Hilfe lesen zu:
; ControlGet, AusgabeVar, List, Optionen, SysListView321, Fenstertitel, Fenstertext
; ... so kann man sich z.B. die einzelnen Zeilen zu jedem Gerät ausgeben:
; ControlGet, Liste, List,, SysListView321, Sound
; Loop, Parse, Liste, `n  ; alle Geräte sind durch Zeilenvorschübe (`n) abgegrenzt
; {
    ; GeraetNr := A_Index
    ; Loop, Parse, A_LoopField, %A_Tab%  ; die Zeilen jedes Gerätes sind durch Tabulatoren (A_Tab) abgegrenzt!
        ; MsgBox Gerät-Nr. %GeraetNr%, Zeile %A_Index%: %A_LoopField%
; }
; Return

ControlGet, Liste, List,, SysListView321, Sound
Loop, Parse, Liste, `n  ; alle Geräte sind durch Zeilenvorschübe (`n) abgegrenzt
{
    GeraetNr := A_Index
    Loop, Parse, A_LoopField, %A_Tab%  ;die Zeilen jedes Gerätes sind durch Tabulatoren (A_Tab) abgegrenzt!
		If A_LoopField = %MySoundGeraet%
		{
			Geraet = %A_Index%
			Gefunden = True	; es soll (bei mir) nur das erste Gerät gefunden werden
			Break	; innere Schleife
		}
	If Gefunden
		Break	; äußere Schleife
}

ControlSend, SysListView321, {DOWN %GeraetNr%}, Sound
ControlSend, Button2, {Space}, Sound		; Space "klickt" bei mir auf "als Standardgerät"
WinClose, Sound
Danke und viel Erfolg
Lucky Joe
User avatar
divanebaba
Posts: 805
Joined: 20 Dec 2016, 03:53
Location: Diaspora

Re: Audiogerät über Button switchen

26 Feb 2018, 12:27

Hallo.
Um mit Sicherheit die passende Reihe (oder doch Zeile?) auszuwählen, könntest Du die ListView zuvor auslesen und Dich dann für einen Eintrag entscheiden.
Auslesen geht mit

Code: Select all

ControlGet, AusgabeVar, List,, SysListView321, Sound, Wiedergabe
Eine womöglich professionellere Lösung ist mir, als Bildungsgeprellter, nicht bekannt. :mrgreen: :mrgreen:

EDIT: Ohh, meinen Ansatz verwendest Du bereits. Dann solltest Du vielleicht nach etwas präziserem suchen, statt nur nach "Lautsprecher". Vorausgesetzt, Dein Headset hat einen eigenen ListView-Eintrag. Meine ListView zeigt drei verschiedene Einträge an, von denen zwei das Suchwort "Lautsprecher" enthalten. Allerdings kann man die Einträge dennoch leicht filtern.

Ein frohes Filtern dann :mrgreen: :mrgreen:
Last edited by divanebaba on 26 Feb 2018, 18:02, edited 1 time in total.
Einfach nur ein toller Typ. :mrgreen:
User avatar
Sora-MMK
Posts: 10
Joined: 25 Jan 2018, 12:59
Location: Germany
Contact:

Re: Audiogerät über Button switchen

26 Feb 2018, 13:22

Wenn ich

Code: Select all

ControlSend, SysListView321, {DOWN %GeraetNr%}, Sound
einfach zu

Code: Select all

ControlSend, SysListView321, {DOWN 2}, Sound
ändere, würde ich auch einfach immer auf Kopfhörer kommen. Würde ich den Code zweimal einbinden auf zwei Knöpfen und den ersten mit

Code: Select all

ControlSend, SysListView321, {DOWN 1}, Sound
und den zweiten mit dem code davor versehen, wäre es auch schon gelöst. Aber dafür brauche ich halt dann 2 Buttons und doppelt so viel Code. Der Code sollte ja eigentlich dafür da sein hin und her zu switchen und somit würde ich glaube das ganze potenzial in die Tonne kloppen.
User avatar
LuckyJoe
Posts: 340
Joined: 02 Oct 2013, 09:52

Re: Audiogerät über Button switchen

26 Feb 2018, 15:30

Hallo Sara,

nur auf die Schnelle: du brauchst zum "Switchen" einen Schalter, der den Zustand deines Buttons überprüft. Auch wenn mein folgender Code vielleicht Fachleute die Haare zu Berge stehen lässt, nur zur Veranschaulichung und als Denkansatz:

Code: Select all

#SingleInstance Force
Gui +Caption
Gui, Font,

	Gui, Add, Button, y130 x15 w190 h40 gAudio, Audio ;Bitte ignoriert die Formatierung, die gehört zum großen ganzen^^

Gui, Font, norm
Gui, Show,
return

Guiclose:
	exitapp

Audio:
vMyVar := vMyVar ? false : true

If vMyVar then
	{
	MySoundGeraet = Lautsprecher
	MsgBox, %MySoundGeraet%
	}
else
	{
	MySoundGeraet = Headset
	MsgBox, %MySoundGeraet%
	}
... und dann weiter. Dabei gehe ich davon aus, dass dein Programm ständig läuft und "vMyVar" bei jedem Button-Druck erhalten bleibt. Falls du das Programm immer neu aufrufst, dann musst du natürlich das Wiedergabegerät erst auslesen und dann damit weiterarbeiten.

Viel Erfolg!
Lucky Joe
Herzliche Grüße aus dem Rheinland
Lucky Joe
User avatar
Sora-MMK
Posts: 10
Joined: 25 Jan 2018, 12:59
Location: Germany
Contact:

Re: Audiogerät über Button switchen

26 Feb 2018, 18:38

Okay danke, ich glaube damit kann ich arbeiten. Mein Programm wird tatsächlich hier und da gestartet, wenn ich es brauche und läuft nicht ständig, aber das sollte ich dann noch hinbekommen.

Dann bleibt glaube nur noch das Problem, dass das Standardkommunikationsgerät mit geswitcht wird. Kann ich das irgendwie verhindern, so dass wirklich nur das Standartgerät wechselt?

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 31 guests