WIN 10 Tablet - ScrollBar - WM_TOUCH

  • Das hier funktioniert so gut, dass ich zunächst in der praktischen Ausführung keinen Scrollfehler am Tablet finde. Gut zu sehen am Listview in der Mitte des Scrollbereichs. Ist nur für den vertikalen y-Bereich ausgeführt:

    2 Mal editiert, zuletzt von TJF (29. Dezember 2017 um 20:30)

  • Das Beispiel scrollt nicht auf dem Tablet! Der Grund liegt darin, dass "If $iDirectionX ..." und "If $iDirectionY ..." nie eintreten...

    Dann lade dir das korrigierte Beispiel aus Post #18 erneut runter... oder ändere die folgenden Zeilen selbst.

    AutoIt
    Global $g_iSendRepeat = 7 ; Wie oft soll die ScrollMessage gesendet werden
    AutoIt
    $aPoints[0][$eID] = DllStructGetData($aTouchInput[0], "dwID")
    $aPoints[0][$eX] = DllStructGetData($aTouchInput[0], "x") / 100
    $aPoints[0][$eY] = DllStructGetData($aTouchInput[0], "y") / 100
  • Das scrollt auch nicht. Kann es sein, dass Du in Zeile 361 (und 365) das "X" und "Y" bei "$Direction" am Anfang vergessen hast? Also z.B. für "X" die Zeile 361:

    AutoIt
    $iDirection = $iX = $aPoints[0][$eX] ? $SB_LINERIGHT : $SB_LINELEFT
  • Borwatt... bin ich ein Troll... ja, daran liegt es... dies ist aber nur einer der beiden Fehler...

    Das wäre sofort ganz böse aufgefallen, wenn ich - wie in meinen Scripten üblich - folgende Option gesetzt hätte...

    AutoIt
    Opt('MustDeclareVars', 1)

    Zweiter Fehler: In Zeile 360 und Zeile 364 prüfe ich, ob sich $iX oder $iY verändert hat... also ob $iX bzw. $iY <> $aPoints[0][...] ist... wenn ja, dann soll $iDirectionX bzw. $iDirectionY ein Wert zugewiesen werden.

    In Zeile 361 und Zeile 365 muss ich dann natürlich prüfen, ob $iX bzw. $iY kleiner oder größer ist!!!

    Die Zeilen 360 und 364 (und die dazugehörigen Zeilen mit EndIf) habe ich eliminiert, weil sich die Abfrage auch in einer Zeile erledigen lässt. ;)

    AutoIt
    $iDirectionX = $iX = $aPoints[0][$eX] ? '' : $iX = $aPoints[0][$eX] ? $SB_LINERIGHT : $SB_LINELEFT ; Wenn $iDirectionX <> '' ist, dann müssen wir horizontal scrollen!
    $iX = $aPoints[0][$eX] ; neue Position merken
    $iDirectionY = $iY = $aPoints[0][$eY] ? '' : $iY > $aPoints[0][$eY] ? $SB_LINEDOWN : $SB_LINEUP ; Wenn  $iDirection <> '' ist, dann müssen wir vertikal scrollen!
    $iY = $aPoints[0][$eY] ; neue Position merken

    Ich habe das Beispiel aus Post #18 nochmals korrigiert... jetzt sollte es aber funktionierten!

  • Scrollt leider nicht. Das liegt aber nicht unbedingt an Deiner WM_TOUCH Funktion! Ich habe bei meinen Tests die Funktionen von Melba auch nicht zum Scrollen gebracht. Hier mal ein Test: Ich habe Deine letzte Version der Funktion hier als _Scrollbars_WM_TOUCH2 in die einfachere Scroll-UDF eingebaut: Es scrollt! Aber: Nur die Fingerbewegung nach oben, d.h. der Scroll-Balken geht nach unten. Zurück, also (Fingerbewegung nach unten) in die andere Richtung mag er überhaupt nicht ... Ich habe das in meiner vorhergehenden Variante immer in der jeweils anderen (falschen Richtung) gebaut... :)

  • Hast Du noch eine Idee, warum in Deiner letzten Version der Funktion das y-Scrollen nur in eine Richtung möglich ist?

    Ja, sicher... viele Ideen... gib mir noch etwas Zeit... den Fehler werde ich garantiert finden!!! Doch welche Version meinst du genau? Link?

    Muss mal überlegen, wie ich bei mir eine WM_TOUCH-Message generieren kann, da ich ja kein Touch... habe...

    Scrollt leider nicht. Das liegt aber nicht unbedingt an Deiner WM_TOUCH Funktion! Ich habe bei meinen Tests die Funktionen von Melba auch nicht zum Scrollen gebracht.

    Das will mir einfach nicht in den Kopf... denn eigentlich passiert da hauptsächlich genau dasselbe, wie in der abgespeckten Mini-Version... wenn du möchtest/kannst, komme ich aber auch gerne mal mit AnyDesk auf dein ???, um den Fehler zu finden.

    Ich baue in Melba's Script noch ein paar Debug-Ausgaben ein... dann sehen wir, wo es hakt... momentan qualmt mir aber der Kopf, weil ich noch einige andere Dinge erledigen muss, die keinen Aufschub dulden. Es kann also noch 1-2 Tage dauern... ;)

  • Ok. Eilt nicht. Freue mich, wenn Du am Ball bist. Schau mal bitte in die letzte angehängte Datei. Live Aufschaltung ist schwierig für die Analyse. Ich habe ein WeTab umgeflasht i.S. Bios und WIN10 aufgespielt. Das funktioniert gut, aber die Resourcen sind dünn. Deshalb schreibe ich Quelltext auf dem normalen PC und kopiere nur die *.exe ständig rüber...

    Das Problem: Wenn das einmal nach oben gescrollt wird, wird jede weitere Berührung nur noch in diese Richtung registriert.

  • Jetzt ist zusätzlich zum noch bestehenden Problem nochmal ein altes Problem aufgetaucht i.S. WM_TOUCH: Der Taster ... Ich habe im anliegenden Beispiel in der GUI einen Beispiel-Button "Taster 1" eingebaut. Hier klickt man einmal drauf und bleibt mit der Maus über dem Button ... Das funktioniert auch mit reinem "mouseover" über MouseGetPos(). Aber wie auf dem Tablet?

  • Beim Tablet-Scrollen aufwärts (Finger geht nach oben) - also wenn korrekt gescrollt wird - ist $iDirectionY immer 1. In die andere Richtung - wenn das Fenster gar nicht gescrollt wird - ist $iDirectionY immer 0.

    Es wird immer die richtige y-Koordinate $iY ausgegeben.

  • Deshalb funktioniert es so testweise auch nach unten:

    AutoIt
    For $i = 1 To $g_iSendRepeat ; Diese Schleife regelt die Scrollgeschwindigkeit... je mehr Durchläufe, desto schneller.
        If $iDirectionX Then _SendMessage($hWnd, $WM_HSCROLL, $iDirectionX) ; horizontal scrollen (rechts, links)
        If ($iDirectionY = 0) Or ($iDirectionY = 1) Then _SendMessage($hWnd, $WM_VSCROLL, $iDirectionY) ; vertikal scrollen (oben, unten)
    Next
  • Wenn ich das jetzt um den x-Scroll ergänze:

    AutoIt
    Scrollbar_Create($hScrollPl, $SB_HORZ, 700)
    Scrollbar_Step(10, $hScrollPl, $SB_HORZ)
    _GUIScrollBars_SetScrollInfoMax($hScrollPl, $SB_HORZ, $hScrollPl_a)

    und das hier auch so ändere. ACHTUNG: Hier ist in der ersten Zeile ein > statt einem =

    AutoIt
    $iDirectionX = $iX = $aPoints[0][$eX] ? '' : $iX > $aPoints[0][$eX] ? $SB_LINERIGHT : $SB_LINELEFT ; Wenn $iDirectionX <> '' ist, dann müssen wir horizontal scrollen!
    $iX = $aPoints[0][$eX] ; neue Position merken
    $iDirectionY = $iY = $aPoints[0][$eY] ? '' : $iY > $aPoints[0][$eY] ? $SB_LINEDOWN : $SB_LINEUP ; Wenn  $iDirectionY <> '' ist, dann müssen wir vertikal scrollen!
    $iY = $aPoints[0][$eY] ; neue Position merken
    For $i = 1 To $g_iSendRepeat ; Diese Schleife regelt die Scrollgeschwindigkeit... je mehr Durchläufe, desto schneller.
        If ($iDirectionX = 0) Or ($iDirectionX = 1) Then _SendMessage($hWnd, $WM_HSCROLL, $iDirectionX) ; horizontal scrollen (rechts, links)
        If ($iDirectionY = 0) Or ($iDirectionY = 1) Then _SendMessage($hWnd, $WM_VSCROLL, $iDirectionY) ; vertikal scrollen (oben, unten)
    Next

    dann scrollt das auch in x-Richtung. Allerdings etwas unausgegoren, weil "Sprünge" in y-Richtung drin sind ...

  • Habe dein Script geändert... die Funktion _Scrollbars_WM_TOUCH... teste es und falls es immer noch irgendwo hakt, dann poste bitte den Inhalt von _Memo().

    Jetzt ist zusätzlich zum noch bestehenden Problem nochmal ein altes Problem aufgetaucht i.S. WM_TOUCH: ...

    Schaue dir mal die Funktion GUIGetCursorInfo() an... ich denke die suchst du.


    Beim Tablet-Scrollen aufwärts (Finger geht nach oben) - also wenn korrekt gescrollt wird - ist $iDirectionY immer 1. In die andere Richtung - wenn das Fenster gar nicht gescrollt wird - ist $iDirectionY immer 0.

    Es wird immer die richtige y-Koordinate $iY ausgegeben.

    Weil du die beiden Variablen in deiner ...Taster.au3 in Zeile 245 und 268 explizit auf 1 setzt...

    ACHTUNG: Hier ist in der ersten Zeile ein > statt einem =

    Ja, guter Mann... da muss auch ein > hin! ;)


  • Ja, guter Mann... da muss auch ein > hin!

    Du hattest ein: = (siehe #25)

    Ändert leider nichts. Scrollt nur in eine Richtung - wie oben gesagt. Anhängend die Output_Y.txt. Wie in #33 gesagt: Das scrollt in beide Richtungen.

    Wir kommen etwas durcheinander. Ich hänge die aktuelle Datei auch nochmal an:

    Ich habe in Zeile 76 bis 78 noch die X-Scroll-Version eingebaut. Diese funktioniert in Deiner letzten Version _Scrollbars_WM_TOUCH auch nur nach links. In Y-Richtung nur nach oben.

    Die Funktion _Scrollbars_WM_TOUCH2 funktioniert in alle Richtungen.

  • @ Bitnugger

    Hast Du Lust, das nochmal anzugehen? Auf der Basis der letzten _Scrollbars_WM_TOUCH bzw. _Scrollbars_WM_TOUCH2. In Deiner Version oben #34 bitte nur beachten, welche dieser beiden Funktionen aktiv ist. Beide scrollen die Fingerbewegung nach oben ($Linedown) - aber nicht nach unten.

    Ich teste gerade nochmal nur mit Y-Scrollbalken. Es bleibt aber bei allen Versionen dabei. Es scrollt nicht, wenn $iDirectionY=0. Folglich scrollt es in beide Richtungen, wenn:

    AutoIt
    If ($iDirectionX = 0) Or ($iDirectionX = 1) Then _SendMessage($hWnd, $WM_HSCROLL, $iDirectionX) ; horizontal scrollen (rechts, links)
    If ($iDirectionY = 0) Or ($iDirectionY = 1) Then _SendMessage($hWnd, $WM_VSCROLL, $iDirectionY) ; vertikal scrollen (oben, unten)

    Es gibt hin und wieder einen kleinen Scrollfehler, dessen Grund ich noch nicht richtig erkennen kann... Funktioniert aber in der Richtung grundsätzlich gut.

    Ich denke der Fehler liegt hier:

    Wenn man mit dem Finger nach oben gewischt hat (also max. $SB_LINEDOWN) und dann ohne (!) Bewegung den Finger in die Mitte des Scrollfenster setzt, passiert das hier (es scrollt dann wieder zurück mit $SB_LINEUP):

    D.h. obwohl $iDirectionY weder 0 noch 1 ist, sondern keinen Wert hat, wird $SB_LINEUP ausgeführt.

    4 Mal editiert, zuletzt von TJF (14. Januar 2018 um 15:56)

  • Hast Du Lust, das nochmal anzugehen?

    Ja sicher doch... habe momentan aber leider wenig bis keine Zeit. ;)

    Neu: GuiScroll.au3

    Neu: GuiScroll_Prog_neu_06.au3

    Neu: GuiScroll_Prog_neu_06_DEBUG.au3 ; Verwendet die Pfeiltasten (Arrow keys), um WM_TOUCH-Nachrichten zu simulieren.


    Bis auf die Accelerator-Keys, die ich zum Testen von $WM_TOUCH in der DEBUG-Version eingebaut habe, sollten beide Versionen identisch sein. Was du nicht brauchst, kannst du ja wieder eliminieren.

    Achtung: die GuiScroll.au3 ist eine geänderte Version!!!

    Teste beide Versionen und falls es bei dir immer noch nicht funktioniert, dann bitte noch mal den Inhalt von _Memo() mit ausreichend Daten für weiter Fehlersuche posten.

    Die DEBUG-Version läuft jedenfalls bei mir... die normale kann ich ja nicht testen... und schau dir die Kommentare gut an!

    So, dann bin ich mal gespannt... :Glaskugel:

  • Erste kurze Rückmeldung: Das ist der fast schon große Wurf! Allerdings wird in die jeweils falsche Richtung gescrollt (x und y)... Ich melde mich in Kürze wieder.

  • Allerdings wird in die jeweils falsche Richtung gescrollt (x und y)...

    Bei WM_TOUCH aber nur, nehme ich mal an...

    Dann musst du nur folgende Zeilen ändern:

    GuiScroll_Prog_neu_06.au3

    Zeile 311: $SB_LINELEFT mit $SB_LINERIGHT vertauschen

    Zeile 312: 'right' mit 'left' vertauschen

    Zeile 317: $SB_LINEUP mit $SB_LINEDOWN vertauschen

    Zeile 318: 'up' mit 'down' vertauschen


    GuiScroll_Prog_neu_06_DEBUG.au3

    Zeile 343: $SB_LINELEFT mit $SB_LINERIGHT vertauschen

    Zeile 344: 'right' mit 'left' vertauschen

    Zeile 349: $SB_LINEUP mit $SB_LINEDOWN vertauschen
    Zeile 350: 'up' mit 'down' vertauschen

    Es kann aber auch gut sein, dass du deinen Monitor drehen musst... :rofl: