• Offizieller Beitrag

    Schon wieder eine kleine UDF (ich bin mittlerweile vom WindowProc überzeugt)!

    Dieses Mal gibt es ein Volume-Controlelement. Das kann man irgendwo auf der eigenen GUI erstellen und es übernimmt dann eigenständig (Standardwert) die Wave-Lautstärke-Einstellung für das Script.

    Man kann dem Control-Element aber auch eine Funktion zuweisen, sodass bei einer Änderung nur diese Funktion aufgerufen wird. Das ist vor allem interessant, wenn man die BASS-UDF verwendet und die Lautstärke-Einstellung für den Stream verwenden will.

    Das kann man schlecht erklären, deswegen habe ich das in das Beispielscript mit eingebaut.

    Die Lautstärke kann man mit einem linken Mausklick auf das Controlelement oder durch drehen des Mausrades über dem Controlelement verändern. Ein linker Mausklick auf das Lautsprechersymbol schaltet das Stummschalten ein/aus.

    Das Controlelement passt sich standardmäßig an das Parent-Window an. Das heißt, dass die Hintergrundfarbe vom Volume-Control gleich der Hintergrundfarbe vom Fenster entspricht. Die Textfarbe ist dann eine Invertierung davon. Weil das aber nicht bei jeder Hintergrundfarbe passt, gibt es auch eine Funktion zum ändern der Farben.

    Die Größe des Controlelements habe ich fest auf 150x50 Pixel festgelegt. Anfangs wollte ich das noch konfigurierbar machen, aber der Aufwand das alles anzupassen war mir zu groß. Man kann also lediglich die Position (Left, Top) anpassen.

    Update v1.1.0.0 (19.07.2018):

    - Ein "Fehler" in "_WinAPI_HiWord" und "_WinAPI_LoWord". Die Funktionen interpretieren alles als Unsigned Int. Dadurch kam es bei Multi-Monitor-Umgebungen zu Fehlern. Behoben!

    - Kleine Änderung beim Refresh. Bei Änderungen wird jetzt nicht mehr "_WinAPI_RedrawWindow", sondern gleich die interne Funktion "_GuiCtrlVolume_SetVolumeGraphic" aufgerufen.

  • Unter Windows 7 funktioniert es wie es soll, doch wenn ich unter Windows 10 in dem Example einen Linksklick auf eines der Controls mache, sehe ich nur noch eine weiße Fläche und erst wenn ich das Mausrad bewege, erscheint es wieder wie es soll, blinkt dabei aber auch bei jeder Änderung kurz weiß auf. Bei dem Regler in ChipHunter habe ich diesen Effekt nicht...

    • Offizieller Beitrag

    wenn ich unter Windows 10 in dem Example einen Linksklick auf eines der Controls mache, sehe ich nur noch eine weiße Fläche und erst wenn ich das Mausrad bewege, erscheint es wieder wie es soll, blinkt dabei aber auch bei jeder Änderung kurz weiß auf.

    Hmmm...kannst Du es mal mit dieser WindowProc versuchen:

  • Also bei mir Win 10, Autoit 3.3.14.5 macht es was es soll auch mit Linksklick. Habe keine weiße Fläche.

    Es gibt drei Wahrheiten: deine Wahrheit, meine Wahrheit und die Wahrheit

  • Hmmm...kannst Du es mal mit dieser WindowProc versuchen:

    Ja, das ist schon fast perfekt... jetzt ist es nur noch die Prozentanzeige rechts neben dem linken Control, die weiß wird bzw. flackert.

    Hehe... also wenn ich einen Linksklick auf das linke Control mache, wird die Prozentanzeige weiß, das aber nur auf dem primären Monitor, auf dem sekundären nicht! Drehe ich das Mausrad, flackert sie.

    Mir ist aber noch ein böser Fehler aufgefallen: Der Laustärkepegel läßt sich nur dann mit dem Mausrad ändern, wenn sich das Fenster auf dem primären Monitor befindet.

    • Offizieller Beitrag

    Mir ist aber noch ein böser Fehler aufgefallen: Der Laustärkepegel läßt sich nur dann mit dem Mausrad ändern, wenn sich das Fenster auf dem primären Monitor befindet.

    Autsch! Blöder "Fehler" in "_WinAPI_HiWord" und "_WinAPI_LoWord". Die Funktionen interpretieren alles als Unsigned Int. Bei negativen Werten kommt also Mist raus. Das sollte in der Hilfe stehen! :huh:

    Das hat also nichts mit primär und sekundär zu tun, sondern, wie Du die Bildschirme angeordnet hast. Auf dem Bildschirm mit negativen Werten funktioniert es nicht. Das führte dann auch zu den Fehlern mit dem linken Mausklick.

    Ich habe jetzt meine Funktion "_WinAPI_MakePoint" so angepasst, dass sie auch mit negativen Werten klarkommt. Neue Version in Post#1.

  • Ja, das mit "_WinAPI_HiWord" und "_WinAPI_LoWord" findest du im MSDN... aber richtig, solche wichtigen Details sollten auch in der AutoIt-Hilfe stehen.

    Sehr schön, mit der neuen Version zickt jetzt nur noch die Prozentanzeige rechts neben dem linken Control. Bewege ich das Mausrad, flackert sie kurz weiß auf, klicke ich mit der linken Mastaste in das Control, wird und bleibt es weiß.

    pasted-from-clipboard.png

    • Offizieller Beitrag

    Ja, das mit "_WinAPI_HiWord" und "_WinAPI_LoWord" findest du im MSDN

    Genau dort habe ich den Hinweis ja auch gefunden. :)

    zickt jetzt nur noch die Prozentanzeige rechts neben dem linken Control

    Nanu?

    Die hat mit der UDF eigentlich nichts zu tun. Jedenfalls nicht direkt.

    Sie wird ja nur in der "Callback"-Funktion aktualisiert. Andererseits wird die Funktion von der WindowsProc aufgerufen.

    Vielleicht fehlt da nur ein Refresh?

    Kannst Du mal diese Funktion ausprobieren:

    AutoIt
    Func _ChangeVolume($iValue)
        Local $iVolume = BitAND($iValue, 0x7F) ; Die Bits 0-6 enthalten die Lautstaerke in Prozent (0...100)
        Local $bMute = BitAND($iValue, 0x80) = 0x80 ; Das Bit 7 dient zur Speicherung des Mute-Zustands (True/False)
        ConsoleWrite(StringFormat('Value: %i\tVolume: %i%\tMute: %s\r\n', $iValue, $iVolume, $bMute))
        GUICtrlSetData($idLabel, $iVolume & '%')
        _WinAPI_InvalidateRect(GUICtrlGetHandle($idLabel))
    EndFunc
  • Kannst Du mal diese Funktion ausprobieren:

    Habe ich... aber dadurch ändert sich leider nichts. Es muss aber etwas mit der WinProc-Funktion zu tun haben, denn bei diesem Beispiel-Script habe ich den Effekt nicht!