_MuteActiveWindow - Sound vom aktiven Fenster stumm schalten.

  • Kurz und knapp:

    Mit der Hilfe von : (Leicht modifiziert von mir)
    https://www.autoitscript.com/forum/topic/16…ndows-controls/

    Habe ich eine kleine UDF geschrieben, mit der man den Ton vom Fenster im Vordergrund oder von einem eigens definierten Fenster, im Volume Mixer Stumm schalten kann, bzw. den Ton wieder anstellen kann.

    Hier ist die UDF: _MuteActiveWindow.au3

    Beispiel:

    Code
    #include <_MuteActiveWindow.au3>
    
    HotKeySet("+!m", "_MuteActiveWindow") ; Shift-Alt-M. - Hotkey to mute active window sound.
    
    While 1
        sleep(200)
    Wend

    Einmal editiert, zuletzt von xTcisloVe (21. Juli 2018 um 08:39)

  • HotKeySet("+!m", "_MuteActiveWindow")

    Das kann nicht funktionieren, weil die mit HotKey aufgerufene Funktion keinen Parameter haben darf und $sTitle in dem Fall nicht deklariert ist.

    AutoIt-Hilfe zu HotKeySet: The called function can not be given parameters. They will be ignored.

    Ein weiteres Problem ist, dass $sStringIncludes (der WindowTitle) in sehr vielen Fällen nicht gefunden wird - habe es z.B. mit FireFox hier auf dieser Seite getestet.
    autoit.de/wcf/attachment/86259/

    If Not StringInStr($text, $sStringIncludes) Then ...

    Die Chancen, dass $sStringIncludes in $text gefunden wird, stehen also sehr schlecht.

    Damit es zumindest zufriedenstellend funktionieren kann, müsste der Teilstring in $text, der nach dem "Stumm für " steht, in $sStringIncludes gesucht werden, und nicht umgekehrt.

    Nächstes Problem wäre, wenn der User sein Windows in einer anderen Sprache (z.B. EN) nutzt... dann wird aus "Stumm für " nämlich "Mute for ". ;)

    Auch mit dem HotKey kann es hakeln, wenn die Funktion erneut aufgerufen wird, bevor sie komplett durchlaufen wurde.

    Ich war mal so frei und habe deine "UDF" (wo sind die UDF-Header?) umgemodelt... du wirst vermutlich nur wenig davon verstehen, aber schau es dir einfach mal an.

  • HotKeySet("+!m", "_MuteActiveWindow")

    Das kann nicht funktionieren, weil die mit HotKey aufgerufene Funktion keinen Parameter haben darf und $sTitle in dem Fall nicht deklariert ist.

    AutoIt-Hilfe zu HotKeySet: The called function can not be given parameters. They will be ignored.

    Ja das hab ich mit Absicht so gemacht, falls jemand oder ich vorher ein Fenster festlegen wollen und ich die Funktion nicht nur über Hotkeys starten wollte.

    Code
    If not IsDeclared("sTitle") Or $sTitle = "" Then $sTitle = WinGetTitle("[ACTIVE]")

    Dadurch wird das brauchen der Variable ja unterbunden...?


    Ich verstehe nicht ganz wieso das mit dem Stumm für ein Problem ist? Ich habe doch nirgends "Stumm für:" definiert sondern ich suche einfach nach dem Fenstertitel und der sollte doch unabhängig von Stumm für: oder Mute for: immer enthalten sein oder irre ich da?

  • Allgemeine Frage:

    Ich habe ein Tray Menu worin ich auch Funktionen via Hotkey aufrufe, wie kann ich verhindern das mein Script stecken bleibt? Du hast das ja hier irgendwo eingebaut....

  • Das IsDeclared kann wegfallen, denn $sTitle wird in jedem Fall deklariert als auch definiert sein, es ist immerhin ein Funktionsparameter.

    Anstatt dort den Wert standardmäßig auf "" zu setzen kannst du auch direkt das WinGetTitle als Standardwert hinschreiben.

    Dann sit es aber nicht mehr möglich das Fenster selber zu wählen.. ohne Global Variable oder?

  • Mit HotKeySet nicht, richtig, aber du solltest generell nicht irgendwelche Variablen beanspruchen welche der User selbst vielleicht nutzen möchte.

    Stattdessen solltest du lieber eine Initialisierungsfunktion anbieten die eine interne Variable beschreibt um dann per Hotkeyset die Funktion zu setzen welche dann auf die interne Variable zugreift.

  • Mit HotKeySet nicht, richtig, aber du solltest generell nicht irgendwelche Variablen beanspruchen welche der User selbst vielleicht nutzen möchte.

    Stattdessen solltest du lieber eine Initialisierungsfunktion anbieten die eine interne Variable beschreibt um dann per Hotkeyset die Funktion zu setzen welche dann auf die interne Variable zugreift.

    Wie geht das?

  • Habe ich doch grad beschrieben oder?

    :D Ich verstehe aber nicht wie du es meinst...

    Wenn ich die Funktion ohne variable Aufrufe wird sie ja in der Funktion festgelegt. Also beanspruche ich sie doch nicht oder?

    Wie soll ich das initialisieren denn aufbauen?

  • Ist das nicht unproblematisch da sie nur local in einer Funktion verwendet wird? WIe umgehe ich das denn?

    Mag ja sein, aber es ist inkonsistent HotKeySet die Funktion zu übergeben obwohl sie eigentlich keine Parameter haben darf.

    Für gewöhnlich bietet man Funktionen an die der User callen soll. Er soll gar nicht wissen wie die UDF hinter den Kulissen funktioniert sondern gibt ihr die Anweisung und die UDF macht dann alles intern selber.

    Funktional ändert das zwar nichts aber so hast du mehr Konsistenz und es ist einfacher zu verstehen.

    Funktionen wie IsDeclared Execute Assign o. ä. sollte man weitestgehend vermeiden, da sie schnell inkonsistenten Code liefern können.

  • Mag ja sein, aber es ist inkonsistent HotKeySet die Funktion zu übergeben obwohl sie eigentlich keine Parameter haben darf.

    Für gewöhnlich bietet man Funktionen an die der User callen soll. Er soll gar nicht wissen wie die UDF hinter den Kulissen funktioniert sondern gibt ihr die Anweisung und die UDF macht dann alles intern selber.

    Funktional ändert das zwar nichts aber so hast du mehr Konsistenz und es ist einfacher zu verstehen.

    Funktionen wie IsDeclared Execute Assign o. ä. sollte man weitestgehend vermeiden, da sie schnell inkonsistenten Code liefern können.

    Ich hab IsDeclared bisher gany gern verwendet ...

    Wie mache ich es denn besser und hast du evtl. ein kleines Beispiel_ Ohne Funktionalitaet zu verlieren ...

  • Wie gesagt, es macht funktional keinen Unterschied ob du das ganze in eine andere Funktion packst oder nicht, aber du solltest

    bei den Regeln bleiben die AutoIt definiert. Wenn HotKeySet nur Funktionen akzeptiert die parameterlos sind solltest du dabei bleiben,

    da ansonsten in einer späteren Version bspw. das Skript komplett crashen kann oder es einfach buggy läuft.

    Es müsste übrigens auch möglich sein die Fensterlautstärke direkt anzupassen statt erst den Mixer explizit zu öffnen.

  • Das erste Bild zeigt, wie es NICHT gemacht werden sollte... und wenn Scite4AutoIt3 benutzt wird, so wie bei mir, wird das Script durch AU3Check beendet, weil die Variable $sTitle nicht deklariert wurde.

    Das zweite Bild zeigt, wie es ohne Probleme funktioniert...

    Ich verstehe nicht ganz wieso das mit dem Stumm für ein Problem ist? Ich habe doch nirgends "Stumm für:" definiert sondern ich suche einfach nach dem Fenstertitel und der sollte doch unabhängig von Stumm für: oder Mute for: immer enthalten sein oder irre ich da?

    Du suchst nach dem Fenstertitel... und wo suchst du danach bzw. wo soll dieser enthalten sein?

    Den suchst du in allen Buttons, die den ClassName "ToolBarWindow32" haben.

    Die Texte für diese Buttons sind in der sndvol.exe inkl. Platzhalter (%1 bzw. %s) enthalten und sind je nach eingestellter Sprache in Windows entsprechend übersetzt.

    Hier mal die Texte in deutscher Sprache inkl. Platzhalter...

    > ResourceLanguages => 1, 1031

    + $iLocale => 1031

    + Language => Deutsch (Deutschland)

    - German string with ID 500 for SndVol.exe : Lautstärke

    - German string with ID 501 for SndVol.exe : Stumm: %1

    - German string with ID 502 for SndVol.exe : Lautstärke für %1

    - German string with ID 503 for SndVol.exe : Stumm für %1

    - German string with ID 504 for SndVol.exe : Name nicht verfügbar

    - German string with ID 505 for SndVol.exe : Anwendungs-Lautstärkeregler für %s anzeigen

    - German string with ID 506 for SndVol.exe : Lautstärkemixer - %s

    - German string with ID 508 for SndVol.exe : Stummschaltung für %1 aufheben

    - German string with ID 509 for SndVol.exe : %1 wird gehört.

    Würdest du dein Windows nun auf englische Sprache umstellen, wäre der Text für "Stumm für %1" dann "Mute for %1".

    Du gehst nun hin und übergibst der Funktion GetAllWindowsControls u.A. den Titel des aktiven Fenster...

    Ok, Firefox ist nun das aktive Window und der WindowTitle ist:

    _MuteActiveWindow - Sound vom aktiven Fenster stumm schalten. - Skripte - AutoIt.de - Das deutschsprachige Forum. - Mozilla Firefox

    Im Lautstärkemixer (sndvol.exe) sind dann z.B. folgende Anwendungen zu finden: Systemsounds, Mozilla Firefox, Ditto, Barbara Mason - Give Me Your Love

    Systemsounds und Mozilla Firefox sollte klar sein... Ditto ist eine Erweiterung für das Clipboard und für AIMP (MP3-Player) wird der Titel des aktuell abgespielten Songs angezeigt.

    Bei den Buttons für diese Anwendungen, die angeklickt werden müssen, damit für diese das Mute getogelt wird, wurde der Platzhalter durch den angezeigten Namen der Anwendung ersetzt...

    deutsch: Stumm für Mozilla Firefox

    englisch: Mute for Mozilla Firefox

    ...

    Die Variablen $text und $sStringIncludes enthalten dann folgende Texte:

    $text            = "Stumm für Mozilla Firefox"$sStringIncludes = "_MuteActiveWindow - Sound vom aktiven Fenster stumm schalten. - Skripte - AutoIt.de - Das deutschsprachige Forum. - Mozilla Firefox"

    Du gehst nun hin...

    ...und prüfst, ob der WindowTitle in einem der Buttontexte enthalten ist.

    If Not StringInStr($text, $sStringIncludes) Then

    Wurde er gefunden, hängst du die ermittelte Instance (durch das %19s mit 4 Leerzeichen) an den ClassName an und gibst ihn als Ergebnis zurück und filterst dann die Leerzeichen wieder aus. Für Firefox wäre es der Button mit dem Text "Stumm für Mozilla Firefox"

    If $text <> "" Then Return "[ClassNN:" & StringFormat("%19s", $iCurrentClass & $iCurrentCount) & "]"

    Merkst du was? ;)


    pasted-from-clipboard.png pasted-from-clipboard.png

    Ich habe übrigens ein AutoHotkey-Script gefunden, mit dem du auch genau das machen kannst, mit dem Unterschied, dass dieses den Lautstärkemixer dabei nicht öffnet.

    https://github.com/kristoffer-tvera/mute-current-application

    5 Mal editiert, zuletzt von Bitnugger (22. Juli 2018 um 21:18)

  • Hallo Leute,

    ich möchte mich hier nur mal kurz einklinken, weil ich es völlig in Ordnung finde, eine Hotkey-Funktion aufzurufen, die auch mit optionalen Parametern aufgerufen werden kann. Ich habe es mir nicht angesehen und es mag sein, dass es hier keinen Sinn ergibt. Aber das allgemein abzulehnen halte ich für falsch.

    Wenn man das will, kann man es genau so machen wie xTcisloVe es vorhatte: If not IsDeclared("sTitle") Then $sTitle = WinGetTitle("[ACTIVE]")

    Mag ja sein, aber es ist inkonsistent HotKeySet die Funktion zu übergeben obwohl sie eigentlich keine Parameter haben darf.

    Das stimmt ja so nicht. In der Hilfe steht nur, dass Parameter ignoriert werden. Deshalb braucht man auch If not IsDeclared . Denn über Hotkey aufgerufen, ist $sTitle eben kein bekannter Parameter.

    Grüße autoiter

  • autoiter

    alpines schreibt hier ja, dass es in späteren Versionen zu Problemen kommen kann... möglich wäre sogar, dass die Funktion dann evtl. gar nicht aufgerufen wird.

    PS: HotKeySet akzeptiert auch Funktionen mit Parameter, ignoriert diese aber, da sie nicht an die Funktion übergeben werden können, wenn das ensprechende HotKey gedrückt wurde.

    Wenn HotKeySet nur Funktionen akzeptiert die parameterlos sind solltest du dabei bleiben,

    da ansonsten in einer späteren Version bspw. das Skript komplett crashen kann oder es einfach buggy läuft.

    Aber das allgemein abzulehnen halte ich für falsch.

    Stimmt... soll und kann jeder machen, wie er will, wenn es funktioniert - und sich dann aber auch nicht wundern, wenn es in späteren Version nicht funktioniert.

    Ich jedenfalls bevorzuge "saubere Lösungen" und mache es deshalb lieber so, wie in meinem Post #17 in Bild 2 zu sehen ist.

  • Nun ja. HotKeySet gibt keine Parameter weiter. Dann nimmt man eben IsDeclared.

    Stimmt... soll und kann jeder machen, wie er will, wenn es funktioniert - und sich dann aber auch nicht wundern, wenn es in späteren Version nicht funktioniert.

    Ihr missversteht das einfach. Ich möchte darauf hinweisen, dass in der Hilfe nicht steht, dass HotkesSet keine Funktionen mit Parametern unterstützt. Da steht nur, dass dabei keine Parameter zugewiesen werden können. Das ist ein Unterschied..

    Grüße autoiter

  • Ihr missversteht das einfach. Ich möchte darauf hinweisen, dass in der Hilfe nicht steht, dass HotkesSet keine Funktionen mit Parametern unterstützt. Da steht nur, dass dabei keine Parameter zugewiesen werden können. Das ist ein Unterschied..

    Habe ich doch geschrieben...

    PS: HotKeySet akzeptiert auch Funktionen mit Parameter, ignoriert diese aber, da sie nicht an die Funktion übergeben werden können, wenn das ensprechende HotKey gedrückt wurde.