1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. TJF

Beiträge von TJF

  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 2. Januar 2018 um 17:10

    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.

  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 2. Januar 2018 um 16:00

    Bitnugger

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

  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 30. Dezember 2017 um 20:02

    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... :)

    Dateien

    GuiScroll_Prog_neu_05.au3 15,64 kB – 295 Downloads
  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 30. Dezember 2017 um 12:03

    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
  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 29. Dezember 2017 um 18:47

    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:

    AutoIt
    #Include <StaticConstants.au3>
    ;~ #include <StructureConstants.au3>
    ;~ #include <WindowsConstants.au3>
    ;~ #include <Array.au3>
    ;~ #include <WinAPI.au3>
    ;~ #include <GUIScrollBars.au3>
    ;~ #include <ScrollBarConstants.au3>
    #include <ListViewConstants.au3>
    #include <Array.au3>
    #include <GuiEdit.au3>
    #include "GuiScroll_alt.au3" ; -> http://autoit.de/index.php?page=Thread&postID=162464#post162464
    
    Global $g_idMemo,$hScrollPl
    Global Const $tagTOUCHINPUT = "LONG x; LONG y; HANDLE hSource; DWORD dwID; DWORD dwFlags; DWORD dwMask; DWORD dwTime; ULONG_PTR dwExtraInfo; DWORD cxContact; DWORD cyContact"
    Global $iMemo = 0
    Global $y = -1
    Global $g_iMouseButtons, $g_iDigitizer
    
    ; Diese Konstanten sind leider noch nicht in Autoit deklariert... sonst wären sie in WindowsConstants.au3 zu finden.
    Global Const $SM_DIGITIZER         = 0x5E ; 94
    Global Const $TABLET_CONFIG_NONE   = 0x00
    Global Const $NID_INTEGRATED_TOUCH = 0x01
    Global Const $NID_EXTERNAL_TOUCH   = 0x02
    Global Const $NID_INTEGRATED_PEN   = 0x04
    Global Const $NID_EXTERNAL_PEN     = 0x08
    Global Const $NID_MULTI_INPUT      = 0x40
    Global Const $NID_READY            = 0x80
    
    ; Specifies that hWnd prefers noncoalesced touch input.
    Global Const $TWF_FINETOUCH = 0x00000001
    
    ; Setting this flag disables palm rejection which reduces delays for getting WM_TOUCH messages. This is useful if you want as quick of a response as possible when a user touches your application.
    ; By default, palm detection is enabled and some WM_TOUCH messages are prevented from being sent to your application. This is useful if you do not want to receive WM_TOUCH messages that are from palm contact.
    Global Const $TWF_WANTPALM  = 0x00000002
    Global $hScrollPl_b = 400; Hoehe Scrollfenster
    Global $hScrollPl_a = 650; Max Scroll
    Global $hScrollPl_c = $hScrollPl_a - $hScrollPl_b; Scrollbereich
    
    
    startGui()
    
    Func startGui()
        _GetSystemMetrics()
        $Gui = GUICreate("", 850, 700, -1, -1)
        $up = GUICtrlCreateButton("UP", 10, 10, 80, 40)
        $down = GUICtrlCreateButton("DOWN", 100, 10, 80, 40)
        GUICtrlCreateLabel("Schliessen mit ESC", 550, 10, 120, 40)
    
        ;GUICtrlCreateLabel("y = ",580, 30)
        ;$iMemo = GUICtrlCreateLabel("",550, 30)
        $iMemo = GUICtrlCreateEdit("", 530, 50, 300, 600, $WS_VSCROLL)
        _GUICtrlEdit_SetLimitText($iMemo, 0x80000000)
    
        GUIRegisterMsg($WM_MOUSEWHEEL, "_Scrollbars_WM_MOUSEWHEEL")
        $hScrollPl = GUICreate("$hScrollPl", 500, $hScrollPl_b, 10, 100, BitOR($WS_POPUP, $WS_GROUP, $WM_VSCROLL, $WS_CLIPSIBLINGS), $WS_EX_MDICHILD, $Gui)
        GUISetBkColor(0xffffff)
        Scrollbar_Create($hScrollPl, $SB_VERT, 500)
        Scrollbar_Step(10, $hScrollPl, $SB_VERT)
        _GUIScrollBars_SetScrollInfoMax($hScrollPl, $SB_VERT, $hScrollPl_a); also: 650 minus 400 Hoehe = 250 scroll
    
        $hDLL = DllCall("User32.dll", "BOOL", "RegisterTouchWindow", "HWND", $hScrollPl, "ULONG", 2) ; hier nach Entstehung von $hScrollPl
        GUIRegisterMsg($WM_TOUCH, "WM_TOUCH")
    
        $art = GUICtrlCreateLabel("", 1, 1) ; Label für folgenden Focus...
        $hListV = GUICtrlCreateListView("1|2", 100, 100, 300, 200, BitOR($LVS_REPORT, $LVS_NOCOLUMNHEADER, $LVS_SHOWSELALWAYS))
    
        GUISetState(@SW_SHOW, $Gui)
        GUISetState(@SW_SHOW, $hScrollPl)
        GUICtrlSetState($art, $GUI_FOCUS); Focus auf Label von $hScrollPl
        GUISwitch($Gui)
        ;GUISetState(@SW_SHOW, $Gui)
    
    
        _Memo(@CRLF & "Vertical" & @CRLF & "--------------------------------------")
        _Memo("nPage....                     : " & _GUIScrollBars_GetScrollInfoPage($hScrollPl, $SB_VERT))
        _Memo("nPos.....                     : " & _GUIScrollBars_GetScrollInfoPos($hScrollPl, $SB_VERT))
        _Memo("nMin.....                     : " & _GUIScrollBars_GetScrollInfoMin($hScrollPl, $SB_VERT))
        _Memo("nMax.....                     : " & _GUIScrollBars_GetScrollInfoMax($hScrollPl, $SB_VERT))
        _Memo("nTrackPos                     : " & _GUIScrollBars_GetScrollInfoTrackPos($hScrollPl, $SB_VERT))
    
        ;_GUIScrollBars_Init($hScrollPl)
        ;_GUIScrollBars_SetScrollInfoPos($hScrollPl,$SB_VERT,100)
        ;_GUIScrollBars_ScrollWindow($hScrollPl,0,200); bewegt nur das Fenster - nicht die Scrollbar
    
        ;Scrollbar_Scroll($hScrollPl, $SB_VERT, 250); scrollt um ...
    
    
        While 1
            $iMsg3 = GUIGetMsg()
            Switch $iMsg3
                Case $GUI_EVENT_CLOSE
                    DllClose($hDLL)
                    Exit
                Case $up
                    MsgBox(0, "Info", "Button up gedrückt")
                    GUICtrlSetState($art, $GUI_FOCUS); Focus auf Label von $hScrollPl
                    Scrollbar_Scroll($hScrollPl, $SB_VERT, 250); scrollt um ...
                Case $down
                    MsgBox(0, "Info", "Button down gedrückt")
                    GUICtrlSetState($art, $GUI_FOCUS); Focus auf Label von $hScrollPl
            EndSwitch
        WEnd
    EndFunc   ;==>startGui
    
    
    ; Die in Au3Check 1.51 eingeführte Anweisung #uses, wurde ab 1.52 in #forceref umbenannt. Diese hat zwei Aufgaben.
    ; 1.) Vermeidung von -w 5 Warnungen durch Au3Check.
    ; 2.) Vermeiden, dass globale Variablen und Funktionen in der Liste der Bezugssymbole erscheinen, wenn eine Funktion z.B. via Call($fn) aufgerufen wird.
    Func WM_TOUCH($hWnd, $Msg, $wParam, $lParam)
        #forceref $hWnd, $Msg
    
        Local Static $aDllError = [ _
                [1, 'Die Dll-Datei kann nicht verwendet werden.'], _
                [2, 'unbekannter Rückgabewert "return type".'], _
                [3, 'Funktion wurde nicht in der DLL-Datei gefunden.'], _
                [4, 'Falsche Anzahl von Parametern.'], _
                [5, 'Falscher Parameter.']], _
                $idwID, $iX, $iY
    
        Local Enum $eID, $eX, $eY
    
        Local $iTouchPoints = _WinAPI_LoWord($wParam) ; Anzahl der Berührungspunkte, an der das Display berührt wurde, als diese Message erstellt wurde.
    
        Local $aTouchInput[$iTouchPoints]
    
        Local $iBuffer = DllStructCreate("BYTE buffer[" & $iTouchPoints * 40 & "]")
    ;~     _Memo("BYTE buffer[" & $iTouchPoints * 40 & "]")
    
        Local $tTouchInfo = DllStructCreate($tagTOUCHINPUT, DllStructGetPtr($iBuffer))
        Local $pTouchInfo = DllStructGetPtr($tTouchInfo)
        Local $iStructSize = DllStructGetSize($tTouchInfo)
    
        For $i = 0 To $iTouchPoints - 1 Step 1
            $aTouchInput[$i] = DllStructCreate($tagTOUCHINPUT, $pTouchInfo + $i * 40)
        Next
    
        ; https://msdn.microsoft.com/de-de/library/windows/desktop/dd317334(v=vs.85).aspx
        ; typedef struct _TOUCHINPUT {
        ;     LONG      x;
        ;     LONG      y;
        ;     HANDLE    hSource;
        ;     DWORD     dwID;
        ;     DWORD     dwFlags;
        ;     DWORD     dwMask;
        ;     DWORD     dwTime;
        ;     ULONG_PTR dwExtraInfo;
        ;     DWORD     cxContact;
        ;     DWORD     cyContact;
        ; } TOUCHINPUT, *PTOUCHINPUT;
    
        Local $aRet = DllCall("User32.dll", "BOOL", "GetTouchInputInfo", "HANDLE", $lParam, "UINT", $wParam, "ULONG_PTR", $pTouchInfo, "int", DllStructGetSize($tTouchInfo))
        ; If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, use the GetLastError function.
    
        If @error Then
            Local $iError = @error, $iIndex = _ArraySearch($aDllError, $iError), $sErrorText = $iIndex = -1 ? 'Unbekannter Fehler' : $aDllError[$iIndex][1]
            _Memo("Error bei DllCall             : " & $iError & ' Errortext = ' & $sErrorText)
            _Memo("_WinAPI_GetLastError()        : " & _WinAPI_GetLastError())
            _Memo("_WinAPI_GetLastErrorMessage() : " & _WinAPI_GetLastErrorMessage())
            _Memo("_ArrayToString($aRet, ', ')   : " & _ArrayToString($aRet, ', '))
        Else
            _Memo("************************************")
            _Memo("Finger Numbers : " & $iTouchPoints)
    
            Local $aPoints[$iTouchPoints][3] ; $idwID, $iX/100, $iY/100
    
            For $j = 0 To $iTouchPoints - 1 Step 1
                $aPoints[$j][$eID] = DllStructGetData($aTouchInput[$j], "dwID")
                $aPoints[$j][$eX]  = DllStructGetData($aTouchInput[$j], "x") / 100
                $aPoints[$j][$eY]  = DllStructGetData($aTouchInput[$j], "y") / 100
                _Memo(StringFormat("Points %2i dwID: %3i x: %5s y: %5s" & $j, $aPoints[$j][$eID], $aPoints[$j][$eX], $aPoints[$j][$eY]))
            Next
            _Memo("Position                      : " & _GUIScrollBars_GetScrollInfoPos($hScrollPl,$SB_VERT))
    
            Local $iPosY = 0
            Local $iPos = 0
            Local $bY = 0
            Local $iDirectionX = 0
            Local $iDirectionY = 0;, $iXAmount, $iYAmount
            Switch $iTouchPoints
                Case 1 ; Gui vertikal scrollen... sobald sich die y-Koordinate in Relation zum Startpunkt geändert hat und sich die dwID nicht geändert hat!
                    ; $idwID, $iX, $iY
                    ; $eID, $eX, $eY
                    If $idwID <> $aPoints[0][$eID] Then ; dann neue ID und Startpunkte merken und auf nächste Message warten
                        $idwID = $aPoints[0][$eID]
                        $iX    = $aPoints[0][$eX]
                        $iY    = $aPoints[0][$eY]
                    Else
                        If $iX <> $aPoints[0][$eX] Then ; dann müssen horizontal wir scrollen!
                            ; $iXAmount ...
                            ; Positive Werte für $iXAmount verschieben den sichtbaren Fensterbereich nach rechts, negative Werte verschieben nach links.
                            ; $iXAmount = DllStructGetData($tTEXTMETRIC, "tmAveCharWidth")
                            ; tmAveCharWidth Definiert die durchschnittliche Breite der Zeichen in der Schrift (üblicherweise festgelegt als die Breite des Buchstabens x).
                            ; Dieser Wert enthält nicht den erforderlichen Überhang für Fett oder kursiv geschriebene Zeichen.
                            ; Positive Werte für $iYAmount verschieben den sichtbaren Fensterbereich nach unten, negative Werte verschieben nach oben.
                            _Memo(StringFormat("WM_TOUCH: Das Fenster wird nach %s gescrollt!", $iX < $aPoints[0][$eX] ? 'rechts' : 'links'))
                            $iDirection = $iX = $aPoints[0][$eX] ? $SB_LINERIGHT : $SB_LINELEFT
                            $iDirectionX = 1
                            $iX = $aPoints[0][$eX] ; neue Position merken
                        EndIf
                        If $iY <> $aPoints[0][$eY] Then ; dann müssen wir vertikal scrollen!
                            $bY = $aPoints[0][$eY] - $iY ; positiv wenn nach unten gewischt wird
                            $iPos = _GUIScrollBars_GetScrollInfoPos($hScrollPl,$SB_VERT)
                            $iPosY = $iPos+$bY
                            If $iPosY < 0 Then
                                $iPosY = 0
                            Endif
                            If $iPosY > $hScrollPl_c Then
                                $iPosY = $hScrollPl_c
                            Endif
                            ; $iYAmount ...
                            ; $iYAmount = DllStructGetData($tTEXTMETRIC, "tmHeight") + DllStructGetData($tTEXTMETRIC, "tmExternalLeading")
                            ; tmHeight Definiert die Höhe (Oberlänge + Unterlänge) der Zeichen.
                            ; tmExternalLeading Definiert den Durchschuß (Abstand) den die Anwendung zwischen den Zeilen hinzufügt.
                            ; Da dieser Bereich sich außerhalb der Schrift befindet, enthält er keine Zeichen und wird nicht durch Textausgabe-Aufrufe modifiziert, weder im Modus OPAQUE noch im Modus TRANSPARENT.
                            ; Der Designer kann dieses Mitglied auf Null setzen.
                            _Memo(StringFormat("WM_TOUCH: Das Fenster wird nach %s gescrollt!", $iY < $aPoints[0][$eY] ? 'unten' : 'oben'))
                            $iDirection = $iY = $aPoints[0][$eY] ? $SB_LINEDOWN : $SB_LINEUP
                            $iDirectionY = 1
                            $iY = $aPoints[0][$eY] ; neue Position merken
                        EndIf
    
                        For $i = 1 To 7 ; Schleife regelt die Scroll Geschwindigkeit, je mehr Durchläufe desto schneller
                            If $iDirectionX = 1 Then Scrollbar_Scroll($hScrollPl,$SB_HORZ, 0)
                            If $iDirectionY = 1 Then Scrollbar_Scroll($hScrollPl,$SB_VERT, $iPosY)
                        Next
                    EndIf
                Case 2 ; manueller Zoom
                        ; tu was...
                Case 3 ; automatischer Zoom
                        ; tu was...
            EndSwitch
        EndIf
    EndFunc   ;==>WM_TOUCH
    
    ; wParam
    ;     Das höherwertige Wort gibt die Entfernung an, um die das Rad gedreht wird, ausgedrückt in Vielfachen oder Unterteilungen von WHEEL_DELTA, was 120 ist. Ein positiver Wert zeigt an,
    ;         dass das Rad  vorwärts gedreht wurde, weg von dem Benutzer; Ein negativer Wert zeigt an, dass das Rad rückwärts zum Benutzer gedreht wurde.
    ;     Das niederwertige Wort gibt an, ob verschiedene virtuelle Tasten gedrückt sind. Dieser Parameter kann einen oder mehrere der folgenden Werte haben.
    ;         MK_CONTROL    0x0008    The CTRL key is down.
    ;         MK_LBUTTON    0x0001    The left mouse button is down.
    ;         MK_MBUTTON    0x0010    The middle mouse button is down.
    ;         MK_RBUTTON    0x0002    The right mouse button is down.
    ;         MK_SHIFT        0x0004    The SHIFT key is down.
    ;         MK_XBUTTON1    0x0020    The first X button is down.
    ;         MK_XBUTTON2    0x0040    The second X button is down.
    ; lParam
    ;     Das niederwertige Wort gibt die X-Koordinate des Zeigers relativ zur oberen linken Ecke des Bildschirms an.
    ;     Das höherwertige Wort gibt die Y-Koordinate des Zeigers relativ zur oberen linken Ecke des Bildschirms an.
    ; Return value
    ;     Wenn eine Anwendung diese Nachricht verarbeitet, sollte sie null zurückgeben.
    
    
    Func _Scrollbars_WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg, $lParam
        Local $iDirection, $iDelta = BitShift($wParam, 16) ; Mouse wheel movement
    
        If BitAND($wParam, 0x0000FFFF) Then ; If Ctrl or Shift pressed move Horz scrollbar
            $iDirection = $SB_LINERIGHT
            If $iDelta > 0 Then $iDirection = $SB_LINELEFT
            _Memo(StringFormat("WM_MOUSEWHEEL: Das Fenster wird nach %s gescrollt!", $iDirection = $SB_LINERIGHT ? 'rechts' : 'links'))
            For $i = 1 To 7
                _SendMessage($hWnd, $WM_HSCROLL, $iDirection)
            Next
        Else ; Move Vert scrollbar
            $iDirection = $SB_LINEDOWN
            If $iDelta > 0 Then $iDirection = $SB_LINEUP
            _Memo(StringFormat("WM_MOUSEWHEEL: Das Fenster wird nach %s gescrollt!", $iDirection = $SB_LINEUP ? 'oben' : 'unten'))
            For $i = 1 To 7 ; Schleife regelt die Scroll Geschwindigkeit, je mehr Durchläufe desto schneller
                _SendMessage($hWnd, $WM_VSCROLL, $iDirection)
            Next
    
        EndIf
    ;~     Return $GUI_RUNDEFMSG
    EndFunc   ;==>_Scrollbars_WM_MOUSEWHEEL
    
    ; https://msdn.microsoft.com/en-us/library/windows/desktop/ms724385(v=vs.85).aspx
    Func _GetSystemMetrics()
            ; ___  0___|___ 10___|___ 20___|___ 30___|___ 40___|___ 50___|___ 60___|___ 70___|___ 80___|___ 90___|
            ; 123456789|123456789|123456789|123456789|123456789|123456789|123456789|123456789|123456789|123456789|
        Local Static $aDigitizer[7] = [ _
            '! $g_iDigitizer: 0x00 - Der Eingabedigitizer verfügt nicht über Fingereingabefunktionen.', _
            '+ $g_iDigitizer: 0x01 - Für die Eingabe wird ein integrierter Fingereingabedigitizer verwendet.', _
            '+ $g_iDigitizer: 0x02 - Für die Eingabe wird ein externer Fingereingabedigitizer verwendet.', _
            '+ $g_iDigitizer: 0x04 - Für die Eingabe wird ein integrierter Stiftdigitizer verwendet.', _
            '+ $g_iDigitizer: 0x08 - Für die Eingabe wird ein externer Stiftdigitizer verwendet.', _
            '+ $g_iDigitizer: 0x40 - Für die Eingabe wird ein Eingabedigitizer verwendet, der Mehrfacheingaben\unterstützt.', _
            '! $g_iDigitizer: 0x80 - Der Eingabedigitizer ist für die Eingabe bereit. Wenn dieser Wert nicht\festgelegt ist, bedeutet dies möglicherweise, dass der Tablettdienst\beendet wurde, der Digitizer nicht unterstützt wird oder die\Digitizertreiber nicht installiert wurden.']
        If _ArraySearch($aDigitizer, '\', 0, 0, 0, 1) > -1 Then
            Local $aSlit, $sIndent = __StringRepeat(' ', StringInStr($aDigitizer[0], '-') -1), $sSpacer = __StringRepeat('-', 96) & @CRLF
            For $i = 0 To UBound($aDigitizer) -1 Step 1
                $aSplit = StringSplit($aDigitizer[$i], '\', 2)
    ;~             If @error Then ContinueLoop
                For $j = 0 To UBound($aSplit) -1 Step 1
                    $aSplit[$j] = $j = 0 ? $aSplit[$j] & @CRLF : StringLeft($aSplit[0], 2) & $sIndent & $aSplit[$j] & @CRLF
    ;~                 If $j = 0 Then $aSplit[$j] &= @CRLF
    ;~                 If $j > 0 Then $aSplit[$j] = StringLeft($aSplit[0], 2) & '  ' & $aSplit[$j] & @CRLF
                Next
                $aDigitizer[$i] = _ArrayToString($aSplit, '')
            Next
        EndIf
    
        ; Ungleich Null, wenn eine Maus installiert ist; ansonsten 0. Dieser Wert ist selten Null, da virtuelle Mäuse unterstützt werden und einige Systeme das Vorhandensein des Ports anstelle des Vorhandenseins einer Maus erkennen.
        $g_iMousePresent = _WinAPI_GetSystemMetrics($SM_MOUSEPRESENT)
        ; Die Anzahl der Tasten auf einer Maus, oder Null, wenn keine Maus installiert ist. PS: Da frage ich mich doch glatt, wozu $SM_MOUSEPRESENT gut sein soll?!
        $g_iMouseButtons = _WinAPI_GetSystemMetrics($SM_CMOUSEBUTTONS)
        ; Ungleich Null, wenn das aktuelle Betriebssystem mindestens Windows 7 oder Windows Server 2008 R2 ist und der Tablet PC-Eingabe-Dienst gestartet wurde; andernfalls 0.
        $g_iDigitizer    = _WinAPI_GetSystemMetrics($SM_DIGITIZER)
    
        ConsoleWrite($sSpacer)
        ConsoleWrite(($g_iMousePresent ? '+ ' : '! ') & '$g_iMousePresent: Du hast '&($g_iMousePresent ? '' : 'k')&'eine Maus angeschlossen!' & @CRLF)
        ConsoleWrite($g_iMouseButtons ? '+ $g_iMouseButtons: Du hast eine Maus mit '&$g_iMouseButtons&' Buttons angeschlossen!' & @CRLF : '! $g_iMouseButtons: Du hast keine Maus angeschlossen!')
    
        For $i = 0 To UBound($aDigitizer) -1 Step 1
            Switch True
                Case $i = 0 And BitAND($g_iDigitizer, $TABLET_CONFIG_NONE) = $TABLET_CONFIG_NONE
                    ConsoleWrite($aDigitizer[0] & @CRLF)
                Case $i = 1 And BitAND($g_iDigitizer, $NID_INTEGRATED_TOUCH) = $NID_INTEGRATED_TOUCH
                    ConsoleWrite($aDigitizer[1] & @CRLF)
                Case $i = 2 And BitAND($g_iDigitizer, $NID_EXTERNAL_TOUCH) = $NID_EXTERNAL_TOUCH
                    ConsoleWrite($aDigitizer[2] & @CRLF)
                Case $i = 3 And BitAND($g_iDigitizer, $NID_INTEGRATED_PEN) = $NID_INTEGRATED_PEN
                    ConsoleWrite($aDigitizer[3] & @CRLF)
                Case $i = 4 And BitAND($g_iDigitizer, $NID_EXTERNAL_PEN) = $NID_EXTERNAL_PEN
                    ConsoleWrite($aDigitizer[4] & @CRLF)
                Case $i = 5 And BitAND($g_iDigitizer, $NID_MULTI_INPUT) = $NID_MULTI_INPUT
                    ConsoleWrite($aDigitizer[5] & @CRLF)
                Case $i = 6 And BitAND($g_iDigitizer, $NID_READY) = $NID_READY
                    ConsoleWrite($aDigitizer[6] & @CRLF)
            EndSwitch
        Next
    
        ConsoleWrite($sSpacer)
    EndFunc  ;==>_GetSystemMetrics
    
    
    Func _Memo($sMessage)
        GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
    EndFunc   ;==>MemoWrite
    
    
    Func __StringRepeat($sString, $iRepeat)
        Local $sStr
        For $i = 1 To $iRepeat Step 1
            $sStr &= $sString
        Next
        Return $sStr
    EndFunc
    Alles anzeigen
  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 29. Dezember 2017 um 18:05

    Scrollt aber auch so nicht:

    AutoIt
    For $i = 1 To $g_iSendRepeat ; 1, hier stand 7... angeblich regelt die Schleife die Scrollgeschwindigkeit... je mehr Durchläufe, desto schneller.
        _SendMessage($hWnd, $WM_HSCROLL, 50) ; horizontal scrollen (rechts, links)
        _SendMessage($hWnd, $WM_VSCROLL, 50) ; vertikal scrollen (oben, unten)
    Next
  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 29. Dezember 2017 um 17:52

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

  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 28. Dezember 2017 um 19:08

    Ich habe das jetzt schon halbwegs (!) in die richtige Richtung gebracht. Habe jetzt hier die aktuelle ScrollPosition ausgelesen und die jeweilige y-Bewegung (Wertdifferenz) addiert. Das ganze muss jetzt noch limitiert werden durch den Scrollbereich ... weil das Scroll-Fenster noch über und unter das Soll verschoben werden kann.

    AutoIt
    If $iY <> $aPoints[0][$eY] Then ; dann müssen wir vertikal scrollen!
            $bY = $aPoints[0][$eY] - $iY ; positiv wenn nach unten gewischt wird
            $iPos = _GUIScrollBars_GetScrollInfoPos($g_hGUI,$SB_VERT)
            ; $iYAmount ...
            ; $iYAmount = DllStructGetData($tTEXTMETRIC, "tmHeight") + DllStructGetData($tTEXTMETRIC, "tmExternalLeading")
            ; tmHeight Definiert die Höhe (Oberlänge + Unterlänge) der Zeichen.
            ; tmExternalLeading Definiert den Durchschuß (Abstand) den die Anwendung zwischen den Zeilen hinzufügt.
            ; Da dieser Bereich sich außerhalb der Schrift befindet, enthält er keine Zeichen und wird nicht durch Textausgabe-Aufrufe modifiziert, weder im Modus OPAQUE noch im Modus TRANSPARENT.
            ; Der Designer kann dieses Mitglied auf Null setzen.
            _Memo(StringFormat("WM_TOUCH: Das Fenster wird nach %s gescrollt!", $iY < $aPoints[0][$eY] ? 'unten' : 'oben'))
            $iDirection = $iY = $aPoints[0][$eY] ? $SB_LINEDOWN : $SB_LINEUP
            $iDirectionY = 1
            $iY = $aPoints[0][$eY] ; neue Position merken
        EndIf
    
        For $i = 1 To 7 ; Schleife regelt die Scroll Geschwindigkeit, je mehr Durchläufe desto schneller
            If $iDirectionX = 1 Then Scrollbar_Scroll($g_hGUI,$SB_HORZ, 0)
            If $iDirectionY = 1 Then Scrollbar_Scroll($g_hGUI,$SB_VERT, $iPos+$bY)
        Next
    Alles anzeigen
  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 28. Dezember 2017 um 17:41

    Ja, definiert ist die Variable. Sie nimmt aber nie einen Wert an. Teste mal:

    AutoIt
    For $i = 1 To 7 ; Schleife regelt die Scroll Geschwindigkeit, je mehr Durchläufe desto schneller
        If $iDirectionX Then _SendMessage($hWnd, $WM_HSCROLL, $iDirectionX)
        If $iDirectionY Then _SendMessage($hWnd, $WM_VSCROLL, $iDirectionY)
        MsgBox(0,"$iDirectionY",$iDirectionY,1)
    Next

    Das hier z.B. gibt einen Wert aus und es scrollt!!! Zwar noch nicht perfekt - aber doch ... :)

    AutoIt
    Func WM_TOUCH($hWnd, $Msg, $wParam, $lParam)
        #forceref $hWnd, $Msg
    
        Local Static $aDllError = [ _
                [1, 'Die Dll-Datei kann nicht verwendet werden.'], _
                [2, 'unbekannter Rückgabewert "return type".'], _
                [3, 'Funktion wurde nicht in der DLL-Datei gefunden.'], _
                [4, 'Falsche Anzahl von Parametern.'], _
                [5, 'Falscher Parameter.']], _
                $idwID, $iX, $iY
    
        Local Enum $eID, $eX, $eY
    
        Local $iTouchPoints = _WinAPI_LoWord($wParam) ; Anzahl der Berührungspunkte, an der das Display berührt wurde, als diese Message erstellt wurde.
    
        Local $aTouchInput[$iTouchPoints]
    
        Local $iBuffer = DllStructCreate("BYTE buffer[" & $iTouchPoints * 40 & "]")
    ;~     _Memo("BYTE buffer[" & $iTouchPoints * 40 & "]")
    
        Local $tTouchInfo = DllStructCreate($tagTOUCHINPUT, DllStructGetPtr($iBuffer))
        Local $pTouchInfo = DllStructGetPtr($tTouchInfo)
        Local $iStructSize = DllStructGetSize($tTouchInfo)
    
        For $i = 0 To $iTouchPoints - 1 Step 1
            $aTouchInput[$i] = DllStructCreate($tagTOUCHINPUT, $pTouchInfo + $i * 40)
        Next
    
        ; https://msdn.microsoft.com/de-de/library/windows/desktop/dd317334(v=vs.85).aspx
        ; typedef struct _TOUCHINPUT {
        ;     LONG      x;
        ;     LONG      y;
        ;     HANDLE    hSource;
        ;     DWORD     dwID;
        ;     DWORD     dwFlags;
        ;     DWORD     dwMask;
        ;     DWORD     dwTime;
        ;     ULONG_PTR dwExtraInfo;
        ;     DWORD     cxContact;
        ;     DWORD     cyContact;
        ; } TOUCHINPUT, *PTOUCHINPUT;
    
        Local $aRet = DllCall("User32.dll", "BOOL", "GetTouchInputInfo", "HANDLE", $lParam, "UINT", $wParam, "ULONG_PTR", $pTouchInfo, "int", DllStructGetSize($tTouchInfo))
        ; If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, use the GetLastError function.
    
        If @error Then
            Local $iError = @error, $iIndex = _ArraySearch($aDllError, $iError), $sErrorText = $iIndex = -1 ? 'Unbekannter Fehler' : $aDllError[$iIndex][1]
            _Memo("Error bei DllCall             : " & $iError & ' Errortext = ' & $sErrorText)
            _Memo("_WinAPI_GetLastError()        : " & _WinAPI_GetLastError())
            _Memo("_WinAPI_GetLastErrorMessage() : " & _WinAPI_GetLastErrorMessage())
            _Memo("_ArrayToString($aRet, ', ')   : " & _ArrayToString($aRet, ', '))
        Else
            _Memo("************************************")
            _Memo("Finger Numbers : " & $iTouchPoints)
    
            Local $aPoints[$iTouchPoints][3] ; $idwID, $iX/100, $iY/100
    
            For $j = 0 To $iTouchPoints - 1 Step 1
                $aPoints[$j][$eID] = DllStructGetData($aTouchInput[$j], "dwID")
                $aPoints[$j][$eX]  = DllStructGetData($aTouchInput[$j], "x") / 100
                $aPoints[$j][$eY]  = DllStructGetData($aTouchInput[$j], "y") / 100
                _Memo(StringFormat("Points %2i dwID: %3i x: %5s y: %5s" & $j, $aPoints[$j][$eID], $aPoints[$j][$eX], $aPoints[$j][$eY]))
            Next
    
            Local $iDirectionX = 0
            Local $iDirectionY = 0;, $iXAmount, $iYAmount
            Switch $iTouchPoints
                Case 1 ; Gui vertikal scrollen... sobald sich die y-Koordinate in Relation zum Startpunkt geändert hat und sich die dwID nicht geändert hat!
                    ; $idwID, $iX, $iY
                    ; $eID, $eX, $eY
                    If $idwID <> $aPoints[0][$eID] Then ; dann neue ID und Startpunkte merken und auf nächste Message warten
                        $idwID = $aPoints[0][$eID]
                        $iX    = $aPoints[0][$eX]
                        $iY    = $aPoints[0][$eY]
                    Else
                        If $iX <> $aPoints[0][$eX] Then ; dann müssen horizontal wir scrollen!
                            ; $iXAmount ...
                            ; Positive Werte für $iXAmount verschieben den sichtbaren Fensterbereich nach rechts, negative Werte verschieben nach links.
                            ; $iXAmount = DllStructGetData($tTEXTMETRIC, "tmAveCharWidth")
                            ; tmAveCharWidth Definiert die durchschnittliche Breite der Zeichen in der Schrift (üblicherweise festgelegt als die Breite des Buchstabens x).
                            ; Dieser Wert enthält nicht den erforderlichen Überhang für Fett oder kursiv geschriebene Zeichen.
                            ; Positive Werte für $iYAmount verschieben den sichtbaren Fensterbereich nach unten, negative Werte verschieben nach oben.
                            _Memo(StringFormat("WM_TOUCH: Das Fenster wird nach %s gescrollt!", $iX < $aPoints[0][$eX] ? 'rechts' : 'links'))
                            $iDirection = $iX = $aPoints[0][$eX] ? $SB_LINERIGHT : $SB_LINELEFT
                            $iDirectionX = 1
                            $iX = $aPoints[0][$eX] ; neue Position merken
                        EndIf
                        If $iY <> $aPoints[0][$eY] Then ; dann müssen wir vertikal scrollen!
                            ; $iYAmount ...
                            ; $iYAmount = DllStructGetData($tTEXTMETRIC, "tmHeight") + DllStructGetData($tTEXTMETRIC, "tmExternalLeading")
                            ; tmHeight Definiert die Höhe (Oberlänge + Unterlänge) der Zeichen.
                            ; tmExternalLeading Definiert den Durchschuß (Abstand) den die Anwendung zwischen den Zeilen hinzufügt.
                            ; Da dieser Bereich sich außerhalb der Schrift befindet, enthält er keine Zeichen und wird nicht durch Textausgabe-Aufrufe modifiziert, weder im Modus OPAQUE noch im Modus TRANSPARENT.
                            ; Der Designer kann dieses Mitglied auf Null setzen.
                            _Memo(StringFormat("WM_TOUCH: Das Fenster wird nach %s gescrollt!", $iY < $aPoints[0][$eY] ? 'unten' : 'oben'))
                            $iDirection = $iY = $aPoints[0][$eY] ? $SB_LINEDOWN : $SB_LINEUP
                            $iDirectionY = 1
                            $iY = $aPoints[0][$eY] ; neue Position merken
                        EndIf
    
                        For $i = 1 To 7 ; Schleife regelt die Scroll Geschwindigkeit, je mehr Durchläufe desto schneller
                            If $iDirectionX = 1 Then Scrollbar_Scroll($g_hGUI,$SB_HORZ, 150)
                            If $iDirectionY = 1 Then Scrollbar_Scroll($g_hGUI,$SB_VERT, 150)
                        Next
                        MsgBox(0,"$iDirectionY/$iY",$iDirectionY & "  /  " & $iY,1)
                        $iDirectionX = 0
                        $iDirectionY = 0
                    EndIf
                Case 2 ; manueller Zoom
                        ; tu was...
                Case 3 ; automatischer Zoom
                        ; tu was...
            EndSwitch
        EndIf
    EndFunc   ;==>WM_TOUCH
    Alles anzeigen
  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 28. Dezember 2017 um 08:22

    Ich meinte auch, dass $iDirectionX nicht weiter definiert ist. Der Fall also nicht eintreten kann ... :)

  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 27. Dezember 2017 um 17:57

    Schaut ja sehr fein aus. Ich habe das mal hier an meine Tablet-Größe angepasst:

    AutoIt
    #Region    ;************ Includes ************
    #include-once
    ;~ #include <GuiButton.au3>
    ;~ #include <GUIConstantsEx.au3>
    #Include <StaticConstants.au3>
    ;~ #include <StructureConstants.au3>
    ;~ #include <WindowsConstants.au3>
    ;~ #include <Array.au3>
    #include <GuiEdit.au3>
    #Include "GuiScroll.au3"
    ;~ #include <WinAPI.au3>
    #EndRegion ;************ Includes ************
    
    ;~ #RequireAdmin
    
    Global $g_hGUI, $g_idMemo
    
    Global $g_iMouseButtons, $g_iDigitizer
    
    ; Diese Konstanten sind leider noch nicht in Autoit deklariert... sonst wären sie in WindowsConstants.au3 zu finden.
    Global Const $SM_DIGITIZER         = 0x5E ; 94
    Global Const $TABLET_CONFIG_NONE   = 0x00
    Global Const $NID_INTEGRATED_TOUCH = 0x01
    Global Const $NID_EXTERNAL_TOUCH   = 0x02
    Global Const $NID_INTEGRATED_PEN   = 0x04
    Global Const $NID_EXTERNAL_PEN     = 0x08
    Global Const $NID_MULTI_INPUT      = 0x40
    Global Const $NID_READY            = 0x80
    
    Global Const $tagTOUCHINPUT = "LONG x; LONG y; HANDLE hSource; DWORD dwID; DWORD dwFlags; DWORD dwMask; DWORD dwTime; ULONG_PTR dwExtraInfo; DWORD cxContact; DWORD cyContact"
    
    ; Specifies that hWnd prefers noncoalesced touch input.
    Global Const $TWF_FINETOUCH = 0x00000001
    
    ; Setting this flag disables palm rejection which reduces delays for getting WM_TOUCH messages. This is useful if you want as quick of a response as possible when a user touches your application.
    ; By default, palm detection is enabled and some WM_TOUCH messages are prevented from being sent to your application. This is useful if you do not want to receive WM_TOUCH messages that are from palm contact.
    Global Const $TWF_WANTPALM  = 0x00000002
    
    _Main()
    
    Func _Main()
        _GetSystemMetrics()
    
        $g_hGUI = GUICreate("GuiScroll_Demo mit WM_MOUSEWHEEL und WM_TOUCH", 720, 680, -1, -1 , BitOR($GUI_SS_DEFAULT_GUI, $WM_VSCROLL, $WM_HSCROLL))
    
        Scrollbar_Create($g_hGUI, $SB_HORZ, 120)
        Scrollbar_Step(10, $g_hGUI, $SB_HORZ)
        _GUIScrollBars_SetScrollInfoMax($g_hGUI, $SB_HORZ, 1024)
        Scrollbar_Create($g_hGUI, $SB_VERT, 120)
        Scrollbar_Step(10, $g_hGUI, $SB_VERT)
        _GUIScrollBars_SetScrollInfoMax($g_hGUI, $SB_VERT, 680)
    
        GUICtrlCreateLabel('Bei WM_MOUSEWHEEL wird mit gedrückter Ctrl-/Shift-Taste horizontal gescrollt!', 10, 10, 700, 22, $SS_CENTER)
        GUICtrlSetFont(-1, 13, 900)
        GUICtrlSetColor(-1, 0xDC322F)
        GUICtrlSetBkColor(-1, 0x073642)
    
        GUICtrlCreateLabel('Hier ist Ende im Gelände... ;-)!', 10, 1180, 700, 22, $SS_CENTER)
        GUICtrlSetFont(-1, 13, 900)
        GUICtrlSetColor(-1, 0xDC322F)
        GUICtrlSetBkColor(-1, 0x073642)
    
        $g_idMemo = GUICtrlCreateEdit("", 10, 60, 420, 600, $WS_VSCROLL)
    ;~     _GUICtrlEdit_SetLimitText($g_iMemo, 0x80000000) ; mit _GUICtrlEdit_AppendText() ist das nicht nötig!
        GUICtrlSetFont($g_idMemo, 9, 400, 0, "Courier New")
    
        ; https://msdn.microsoft.com/de-de/library/windows/desktop/dd317326(v=vs.85).aspx
        DllCall("User32.dll", "BOOL", "RegisterTouchWindow", "HWND", $g_hGUI, "ULONG", $TWF_WANTPALM)
    
        GUIRegisterMsg($WM_TOUCH, "WM_TOUCH")
    
        GUISetState()
    
        GUIRegisterMsg($WM_MOUSEWHEEL, "_Scrollbars_WM_MOUSEWHEEL")
    
        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    Exit
            EndSwitch
        WEnd
    EndFunc   ;==>_Main
    
    ; Die in Au3Check 1.51 eingeführte Anweisung #uses, wurde ab 1.52 in #forceref umbenannt. Diese hat zwei Aufgaben.
    ; 1.) Vermeidung von -w 5 Warnungen durch Au3Check.
    ; 2.) Vermeiden, dass globale Variablen und Funktionen in der Liste der Bezugssymbole erscheinen, wenn eine Funktion z.B. via Call($fn) aufgerufen wird.
    Func WM_TOUCH($hWnd, $Msg, $wParam, $lParam)
        #forceref $hWnd, $Msg
    
        Local Static $aDllError = [ _
                [1, 'Die Dll-Datei kann nicht verwendet werden.'], _
                [2, 'unbekannter Rückgabewert "return type".'], _
                [3, 'Funktion wurde nicht in der DLL-Datei gefunden.'], _
                [4, 'Falsche Anzahl von Parametern.'], _
                [5, 'Falscher Parameter.']], _
                $idwID, $iX, $iY
    
        Local Enum $eID, $eX, $eY
    
        Local $iTouchPoints = _WinAPI_LoWord($wParam) ; Anzahl der Berührungspunkte, an der das Display berührt wurde, als diese Message erstellt wurde.
    
        Local $aTouchInput[$iTouchPoints]
    
        Local $iBuffer = DllStructCreate("BYTE buffer[" & $iTouchPoints * 40 & "]")
    ;~     _Memo("BYTE buffer[" & $iTouchPoints * 40 & "]")
    
        Local $tTouchInfo = DllStructCreate($tagTOUCHINPUT, DllStructGetPtr($iBuffer))
        Local $pTouchInfo = DllStructGetPtr($tTouchInfo)
        Local $iStructSize = DllStructGetSize($tTouchInfo)
    
        For $i = 0 To $iTouchPoints - 1 Step 1
            $aTouchInput[$i] = DllStructCreate($tagTOUCHINPUT, $pTouchInfo + $i * 40)
        Next
    
        ; https://msdn.microsoft.com/de-de/library/windows/desktop/dd317334(v=vs.85).aspx
        ; typedef struct _TOUCHINPUT {
        ;     LONG      x;
        ;     LONG      y;
        ;     HANDLE    hSource;
        ;     DWORD     dwID;
        ;     DWORD     dwFlags;
        ;     DWORD     dwMask;
        ;     DWORD     dwTime;
        ;     ULONG_PTR dwExtraInfo;
        ;     DWORD     cxContact;
        ;     DWORD     cyContact;
        ; } TOUCHINPUT, *PTOUCHINPUT;
    
        Local $aRet = DllCall("User32.dll", "BOOL", "GetTouchInputInfo", "HANDLE", $lParam, "UINT", $wParam, "ULONG_PTR", $pTouchInfo, "int", DllStructGetSize($tTouchInfo))
        ; If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, use the GetLastError function.
    
        If @error Then
            Local $iError = @error, $iIndex = _ArraySearch($aDllError, $iError), $sErrorText = $iIndex = -1 ? 'Unbekannter Fehler' : $aDllError[$iIndex][1]
            _Memo("Error bei DllCall             : " & $iError & ' Errortext = ' & $sErrorText)
            _Memo("_WinAPI_GetLastError()        : " & _WinAPI_GetLastError())
            _Memo("_WinAPI_GetLastErrorMessage() : " & _WinAPI_GetLastErrorMessage())
            _Memo("_ArrayToString($aRet, ', ')   : " & _ArrayToString($aRet, ', '))
        Else
            _Memo("************************************")
            _Memo("Finger Numbers : " & $iTouchPoints)
    
            Local $aPoints[$iTouchPoints][3] ; $idwID, $iX/100, $iY/100
    
            For $j = 0 To $iTouchPoints - 1 Step 1
                $aPoints[$j][$eID] = DllStructGetData($aTouchInput[$j], "dwID")
                $aPoints[$j][$eX]  = DllStructGetData($aTouchInput[$j], "x") / 100
                $aPoints[$j][$eY]  = DllStructGetData($aTouchInput[$j], "y") / 100
                _Memo(StringFormat("Points %2i dwID: %3i x: %5s y: %5s" & $j, $aPoints[$j][$eID], $aPoints[$j][$eX], $aPoints[$j][$eY]))
            Next
    
            Local $iDirectionX, $iDirectionY ;, $iXAmount, $iYAmount
            Switch $iTouchPoints
                Case 1 ; Gui vertikal scrollen... sobald sich die y-Koordinate in Relation zum Startpunkt geändert hat und sich die dwID nicht geändert hat!
                    ; $idwID, $iX, $iY
                    ; $eID, $eX, $eY
                    If $idwID <> $aPoints[0][$eID] Then ; dann neue ID und Startpunkte merken und auf nächste Message warten
                        $idwID = $aPoints[0][$eID]
                        $iX    = $aPoints[0][$eX]
                        $iY    = $aPoints[0][$eY]
                    Else
                        If $iX <> $aPoints[0][$eX] Then ; dann müssen horizontal wir scrollen!
                            ; $iXAmount ...
                            ; Positive Werte für $iXAmount verschieben den sichtbaren Fensterbereich nach rechts, negative Werte verschieben nach links.
                            ; $iXAmount = DllStructGetData($tTEXTMETRIC, "tmAveCharWidth")
                            ; tmAveCharWidth Definiert die durchschnittliche Breite der Zeichen in der Schrift (üblicherweise festgelegt als die Breite des Buchstabens x).
                            ; Dieser Wert enthält nicht den erforderlichen Überhang für Fett oder kursiv geschriebene Zeichen.
                            ; Positive Werte für $iYAmount verschieben den sichtbaren Fensterbereich nach unten, negative Werte verschieben nach oben.
                            _Memo(StringFormat("WM_TOUCH: Das Fenster wird nach %s gescrollt!", $iX < $aPoints[0][$eX] ? 'rechts' : 'links'))
                            $iDirection = $iX = $aPoints[0][$eX] ? $SB_LINERIGHT : $SB_LINELEFT
                            $iX = $aPoints[0][$eX] ; neue Position merken
                        EndIf
                        If $iY <> $aPoints[0][$eY] Then ; dann müssen wir vertikal scrollen!
                            ; $iYAmount ...
                            ; $iYAmount = DllStructGetData($tTEXTMETRIC, "tmHeight") + DllStructGetData($tTEXTMETRIC, "tmExternalLeading")
                            ; tmHeight Definiert die Höhe (Oberlänge + Unterlänge) der Zeichen.
                            ; tmExternalLeading Definiert den Durchschuß (Abstand) den die Anwendung zwischen den Zeilen hinzufügt.
                            ; Da dieser Bereich sich außerhalb der Schrift befindet, enthält er keine Zeichen und wird nicht durch Textausgabe-Aufrufe modifiziert, weder im Modus OPAQUE noch im Modus TRANSPARENT.
                            ; Der Designer kann dieses Mitglied auf Null setzen.
                            _Memo(StringFormat("WM_TOUCH: Das Fenster wird nach %s gescrollt!", $iY < $aPoints[0][$eY] ? 'unten' : 'oben'))
                            $iDirection = $iY = $aPoints[0][$eY] ? $SB_LINEDOWN : $SB_LINEUP
                            $iY = $aPoints[0][$eY] ; neue Position merken
                        EndIf
    
                        For $i = 1 To 7 ; Schleife regelt die Scroll Geschwindigkeit, je mehr Durchläufe desto schneller
                            If $iDirectionX Then _SendMessage($hWnd, $WM_HSCROLL, $iDirectionX)
                            If $iDirectionX Then _SendMessage($hWnd, $WM_VSCROLL, $iDirectionY)
                        Next
                    EndIf
                Case 2 ; manueller Zoom
                        ; tu was...
                Case 3 ; automatischer Zoom
                        ; tu was...
            EndSwitch
        EndIf
    EndFunc   ;==>WM_TOUCH
    
    ; wParam
    ;     Das höherwertige Wort gibt die Entfernung an, um die das Rad gedreht wird, ausgedrückt in Vielfachen oder Unterteilungen von WHEEL_DELTA, was 120 ist. Ein positiver Wert zeigt an,
    ;         dass das Rad  vorwärts gedreht wurde, weg von dem Benutzer; Ein negativer Wert zeigt an, dass das Rad rückwärts zum Benutzer gedreht wurde.
    ;     Das niederwertige Wort gibt an, ob verschiedene virtuelle Tasten gedrückt sind. Dieser Parameter kann einen oder mehrere der folgenden Werte haben.
    ;         MK_CONTROL    0x0008    The CTRL key is down.
    ;         MK_LBUTTON    0x0001    The left mouse button is down.
    ;         MK_MBUTTON    0x0010    The middle mouse button is down.
    ;         MK_RBUTTON    0x0002    The right mouse button is down.
    ;         MK_SHIFT        0x0004    The SHIFT key is down.
    ;         MK_XBUTTON1    0x0020    The first X button is down.
    ;         MK_XBUTTON2    0x0040    The second X button is down.
    ; lParam
    ;     Das niederwertige Wort gibt die X-Koordinate des Zeigers relativ zur oberen linken Ecke des Bildschirms an.
    ;     Das höherwertige Wort gibt die Y-Koordinate des Zeigers relativ zur oberen linken Ecke des Bildschirms an.
    ; Return value
    ;     Wenn eine Anwendung diese Nachricht verarbeitet, sollte sie null zurückgeben.
    Func _Scrollbars_WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg, $lParam
        Local $iDirection, $iDelta = BitShift($wParam, 16) ; Mouse wheel movement
    
        If BitAND($wParam, 0x0000FFFF) Then ; If Ctrl or Shift pressed move Horz scrollbar
            $iDirection = $SB_LINERIGHT
            If $iDelta > 0 Then $iDirection = $SB_LINELEFT
            _Memo(StringFormat("WM_MOUSEWHEEL: Das Fenster wird nach %s gescrollt!", $iDirection = $SB_LINERIGHT ? 'rechts' : 'links'))
            For $i = 1 To 7
                _SendMessage($hWnd, $WM_HSCROLL, $iDirection)
            Next
        Else ; Move Vert scrollbar
            $iDirection = $SB_LINEDOWN
            If $iDelta > 0 Then $iDirection = $SB_LINEUP
            _Memo(StringFormat("WM_MOUSEWHEEL: Das Fenster wird nach %s gescrollt!", $iDirection = $SB_LINEUP ? 'oben' : 'unten'))
            For $i = 1 To 7 ; Schleife regelt die Scroll Geschwindigkeit, je mehr Durchläufe desto schneller
                _SendMessage($hWnd, $WM_VSCROLL, $iDirection)
            Next
    
        EndIf
    ;~     Return $GUI_RUNDEFMSG
    EndFunc   ;==>_Scrollbars_WM_MOUSEWHEEL
    
    ; https://msdn.microsoft.com/en-us/library/windows/desktop/ms724385(v=vs.85).aspx
    Func _GetSystemMetrics()
            ; ___  0___|___ 10___|___ 20___|___ 30___|___ 40___|___ 50___|___ 60___|___ 70___|___ 80___|___ 90___|
            ; 123456789|123456789|123456789|123456789|123456789|123456789|123456789|123456789|123456789|123456789|
        Local Static $aDigitizer[7] = [ _
            '! $g_iDigitizer: 0x00 - Der Eingabedigitizer verfügt nicht über Fingereingabefunktionen.', _
            '+ $g_iDigitizer: 0x01 - Für die Eingabe wird ein integrierter Fingereingabedigitizer verwendet.', _
            '+ $g_iDigitizer: 0x02 - Für die Eingabe wird ein externer Fingereingabedigitizer verwendet.', _
            '+ $g_iDigitizer: 0x04 - Für die Eingabe wird ein integrierter Stiftdigitizer verwendet.', _
            '+ $g_iDigitizer: 0x08 - Für die Eingabe wird ein externer Stiftdigitizer verwendet.', _
            '+ $g_iDigitizer: 0x40 - Für die Eingabe wird ein Eingabedigitizer verwendet, der Mehrfacheingaben\unterstützt.', _
            '! $g_iDigitizer: 0x80 - Der Eingabedigitizer ist für die Eingabe bereit. Wenn dieser Wert nicht\festgelegt ist, bedeutet dies möglicherweise, dass der Tablettdienst\beendet wurde, der Digitizer nicht unterstützt wird oder die\Digitizertreiber nicht installiert wurden.']
        If _ArraySearch($aDigitizer, '\', 0, 0, 0, 1) > -1 Then
            Local $aSlit, $sIndent = __StringRepeat(' ', StringInStr($aDigitizer[0], '-') -1), $sSpacer = __StringRepeat('-', 96) & @CRLF
            For $i = 0 To UBound($aDigitizer) -1 Step 1
                $aSplit = StringSplit($aDigitizer[$i], '\', 2)
    ;~             If @error Then ContinueLoop
                For $j = 0 To UBound($aSplit) -1 Step 1
                    $aSplit[$j] = $j = 0 ? $aSplit[$j] & @CRLF : StringLeft($aSplit[0], 2) & $sIndent & $aSplit[$j] & @CRLF
    ;~                 If $j = 0 Then $aSplit[$j] &= @CRLF
    ;~                 If $j > 0 Then $aSplit[$j] = StringLeft($aSplit[0], 2) & '  ' & $aSplit[$j] & @CRLF
                Next
                $aDigitizer[$i] = _ArrayToString($aSplit, '')
            Next
        EndIf
    
        ; Ungleich Null, wenn eine Maus installiert ist; ansonsten 0. Dieser Wert ist selten Null, da virtuelle Mäuse unterstützt werden und einige Systeme das Vorhandensein des Ports anstelle des Vorhandenseins einer Maus erkennen.
        $g_iMousePresent = _WinAPI_GetSystemMetrics($SM_MOUSEPRESENT)
        ; Die Anzahl der Tasten auf einer Maus, oder Null, wenn keine Maus installiert ist. PS: Da frage ich mich doch glatt, wozu $SM_MOUSEPRESENT gut sein soll?!
        $g_iMouseButtons = _WinAPI_GetSystemMetrics($SM_CMOUSEBUTTONS)
        ; Ungleich Null, wenn das aktuelle Betriebssystem mindestens Windows 7 oder Windows Server 2008 R2 ist und der Tablet PC-Eingabe-Dienst gestartet wurde; andernfalls 0.
        $g_iDigitizer    = _WinAPI_GetSystemMetrics($SM_DIGITIZER)
    
        ConsoleWrite($sSpacer)
        ConsoleWrite(($g_iMousePresent ? '+ ' : '! ') & '$g_iMousePresent: Du hast '&($g_iMousePresent ? '' : 'k')&'eine Maus angeschlossen!' & @CRLF)
        ConsoleWrite($g_iMouseButtons ? '+ $g_iMouseButtons: Du hast eine Maus mit '&$g_iMouseButtons&' Buttons angeschlossen!' & @CRLF : '! $g_iMouseButtons: Du hast keine Maus angeschlossen!')
    
        For $i = 0 To UBound($aDigitizer) -1 Step 1
            Switch True
                Case $i = 0 And BitAND($g_iDigitizer, $TABLET_CONFIG_NONE) = $TABLET_CONFIG_NONE
                    ConsoleWrite($aDigitizer[0] & @CRLF)
                Case $i = 1 And BitAND($g_iDigitizer, $NID_INTEGRATED_TOUCH) = $NID_INTEGRATED_TOUCH
                    ConsoleWrite($aDigitizer[1] & @CRLF)
                Case $i = 2 And BitAND($g_iDigitizer, $NID_EXTERNAL_TOUCH) = $NID_EXTERNAL_TOUCH
                    ConsoleWrite($aDigitizer[2] & @CRLF)
                Case $i = 3 And BitAND($g_iDigitizer, $NID_INTEGRATED_PEN) = $NID_INTEGRATED_PEN
                    ConsoleWrite($aDigitizer[3] & @CRLF)
                Case $i = 4 And BitAND($g_iDigitizer, $NID_EXTERNAL_PEN) = $NID_EXTERNAL_PEN
                    ConsoleWrite($aDigitizer[4] & @CRLF)
                Case $i = 5 And BitAND($g_iDigitizer, $NID_MULTI_INPUT) = $NID_MULTI_INPUT
                    ConsoleWrite($aDigitizer[5] & @CRLF)
                Case $i = 6 And BitAND($g_iDigitizer, $NID_READY) = $NID_READY
                    ConsoleWrite($aDigitizer[6] & @CRLF)
            EndSwitch
        Next
    
        ConsoleWrite($sSpacer)
    EndFunc  ;==>_GetSystemMetrics
    
    Func _Memo($sString)
        If $sString Then _GUICtrlEdit_AppendText($g_idMemo, $sString & @CRLF)
    EndFunc
    
    Func __StringRepeat($sString, $iRepeat)
        Local $sStr
        For $i = 1 To $iRepeat Step 1
            $sStr &= $sString
        Next
        Return $sStr
    EndFunc
    Alles anzeigen

    Die Rückmeldungen kommen wie gewünscht. Bis auf das Scrollen :). Hier stehe ich mit der Variable auf dem Schlauch:

    Code
    $iDirectionX
    Code
    For $i = 1 To 7 ; Schleife regelt die Scroll Geschwindigkeit, je mehr Durchläufe desto schneller
        If $iDirectionX Then _SendMessage($hWnd, $WM_HSCROLL, $iDirectionX)
        If $iDirectionX Then _SendMessage($hWnd, $WM_VSCROLL, $iDirectionY)
    Next
  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 27. Dezember 2017 um 08:39

    Wow...

    Ich melde mich am späten Nachmittag genauer zurück. Muss heute arbeiten...

    In x-Richtung scrolle ich momentan gar nicht. In y-Richtung zwischen 0 und 250 in meinem Demo-Scrollbereich. Das ist aber fensterabhängig.

  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 26. Dezember 2017 um 11:54

    Wenn ich mit einem "Fingerstreich" scrolle (also pausenlos den Finger auf dem Tablet bewege) wird die WM_TOUCH Funktion mehrmals durchlaufen. Eine einzelne Berührung, die nicht "scrollt" ist unerheblich. Genau für diese eine "Fingerstreich"-Aktion ist eine dwID aussagekräftig. Diese hat einen ersten Koordinaten-Wert (der Punkt auf der Tablet-Koordinate wo der Finger aufsetzt) und einen letzten Wert (der Punkt auf der Tablet-Koordinate wo der Finger wieder absetzt). Die Differenz muss dann mit der Scrollfunktion synchronisiert werden.

    Der erste Gedanke, der mir dabei kommt, ist die Speicherung in einem sich verändernden Array am Ende der WM_TOUCH-Funktion. Vielleicht bin ich da aber auch gerade zu kompliziert drauf... :/

  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 26. Dezember 2017 um 10:16

    Ahh... Ich hatte den wParam falsch verstanden! Dann müßte das Delta-y (ich brauche nur den y-Scrollweg) über dieselbe dwID und die Differenz des y-Wertes dabei (zwischen Anfang und Ende der andauernden Fingerbewegung) auf die Funktionen der <GuiScrollBars.au3> übertragen werden um die entsprechenden Positionen zu synchronisieren.

    Vielen Dank!

    Wobei dann jetzt für jeden WM_TOUCH-Durchlauf mit dieser einen dwID in Verbindung mit dem ersten und letzten y-Wert ein Speicher zur Auswertung angelegt werden. Tricky ...

  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 25. Dezember 2017 um 18:38

    Hatte ich natürlich zwischenzeitlich aktiviert - ohne Erkenntnisse ... Hier die Ausgabe mit Deinen Zeilen:

    Code
    Vertical
    --------------------------------------
    nPage....: 400
    nPos.....: 0
    nMin.....: 0
    nMax.....: 650
    nTrackPos: 0
    $hWnd                         : 0x00010392
    $Msg                          : 576
    $wParam                       : 0x00000001
    $lParam                       : 0x0F110000
    @error                        : 0
    _WinAPI_GetLastError()        : 0
    _WinAPI_GetLastErrorMessage() : Der Vorgang wurde erfolgreich beendet.
    Func0 Ret                     : 1
    ************************************
    Finger Numbers: 1
    Points 0 dwID: 13  x: 318  y: 172
    $hWnd                         : 0x00010392
    $Msg                          : 576
    $wParam                       : 0x00000001
    $lParam                       : 0x0F140000
    @error                        : 0
    _WinAPI_GetLastError()        : 0
    _WinAPI_GetLastErrorMessage() : Der Vorgang wurde erfolgreich beendet.
    Func0 Ret                     : 1
    ************************************
    Finger Numbers: 1
    Points 0 dwID: 13  x: 317  y: 179
    $hWnd                         : 0x00010392
    $Msg                          : 576
    $wParam                       : 0x00000001
    $lParam                       : 0x0F170000
    @error                        : 0
    _WinAPI_GetLastError()        : 0
    _WinAPI_GetLastErrorMessage() : Der Vorgang wurde erfolgreich beendet.
    Func0 Ret                     : 1
    ************************************
    Finger Numbers: 1
    Points 0 dwID: 13  x: 314  y: 241
    $hWnd                         : 0x00010392
    $Msg                          : 576
    $wParam                       : 0x00000001
    $lParam                       : 0x0F1A0000
    @error                        : 0
    _WinAPI_GetLastError()        : 0
    _WinAPI_GetLastErrorMessage() : Der Vorgang wurde erfolgreich beendet.
    Func0 Ret                     : 1
    ************************************
    Finger Numbers: 1
    Points 0 dwID: 13  x: 312  y: 282
    $hWnd                         : 0x00010392
    $Msg                          : 576
    $wParam                       : 0x00000001
    $lParam                       : 0x0F1D0000
    @error                        : 0
    _WinAPI_GetLastError()        : 0
    _WinAPI_GetLastErrorMessage() : Der Vorgang wurde erfolgreich beendet.
    Func0 Ret                     : 1
    ************************************
    Finger Numbers: 1
    Points 0 dwID: 13  x: 312  y: 282
    Alles anzeigen

    Microsoft sagt z.B. zu wParam: Link

  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 24. Dezember 2017 um 12:50

    Hallo allerseits,

    ich bin ein klein wenig weitergekommen und habe mich mal an diesem Script probiert:

    Spoiler anzeigen
    C
    #include <GUIConstantsEx.au3>
    #include <GuiButton.au3>
    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>
    #include <GuiEdit.au3>
    #include <WinAPI.au3>
    
    #RequireAdmin
    
    Global $iMemo
    Global $WM_TOUCH = 0x240
    Local $hGUI
    
    Global Const $tagTOUCHINPUT = "LONG x; LONG y; HANDLE hSource; DWORD dwID; DWORD dwFlags; DWORD dwMask; DWORD dwTime; ULONG_PTR dwExtraInfo; DWORD cxContact; DWORD cyContact"
    
    _Main()
    
    Func _Main()
    
        $hGUI = GUICreate("WM_TOUCH", 1080, 640)
    
        $iMemo = GUICtrlCreateEdit("", 10, 10, 300, 600, $WS_VSCROLL)
        _GUICtrlEdit_SetLimitText($iMemo, 0x80000000)
        GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
    
        DllCall("User32.dll", "BOOL", "RegisterTouchWindow", "HWND", $hGUI, "ULONG", 2)
        
        GUIRegisterMsg($WM_TOUCH, "WM_TOUCH")
    
        GUISetState()
    
        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    ExitLoop
            EndSwitch
        WEnd
    
        Exit
    
    EndFunc   ;==>_Main
    
    Func WM_TOUCH($hWnd, $Msg, $wParam, $lParam)
       
        Dim $arrayTouchInput[Int($wParam)]
        $Buffer = DllStructCreate("BYTE buffer[" & (Int($wParam)*40) & "]")
        ;GUICtrlSetData($iMemo, "BYTE buffer[" & (Int($wParam)*40) & "]" & @CRLF, 1)
        
        $TouchInfo = DllStructCreate($tagTOUCHINPUT, DllStructGetPtr($Buffer))
        $pTouchInfo = DllStructGetPtr($TouchInfo)
        
        For $i = 0 To (Int($wParam)-1) Step 1
            $arrayTouchInput[$i] = DllStructCreate($tagTOUCHINPUT, ($pTouchInfo+($i*40)))
        Next
     
        $aRet0 = DllCall("User32.dll", "BOOL", "GetTouchInputInfo", "HANDLE", $lParam, "UINT", $wParam, "ULONG_PTR", $pTouchInfo, "int", DllStructGetSize($TouchInfo))
        ;GUICtrlSetData($iMemo, "@error: " & @error & @CRLF, 1)  
        ;GUICtrlSetData($iMemo, "_WinAPI_GetLastError(): " & _WinAPI_GetLastError() & @CRLF, 1)
        ;GUICtrlSetData($iMemo, "Func0 Ret: " & $aRet0[0] & @CRLF, 1)
        
        GUICtrlSetData($iMemo, "************************************" & @CRLF, 1)
        GUICtrlSetData($iMemo, "Finger Numbers: " & Int($wParam) & @CRLF, 1)
        For $j = 0 To (Int($wParam)-1) Step 1
            GUICtrlSetData($iMemo, "Points " & $j & " dwID: " & DllStructGetData($arrayTouchInput[$j], "dwID") & " ", 1)
            GUICtrlSetData($iMemo, " x: " & DllStructGetData($arrayTouchInput[$j], "x")/100 & " ", 1)
            GUICtrlSetData($iMemo, " y: " & DllStructGetData($arrayTouchInput[$j], "y")/100 & @CRLF, 1)
        Next
        
        ;GUICtrlSetData($iMemo, "TouchInfo Size: " & DllStructGetSize($TouchInfo) & @CRLF, 1)
        ;$aRet1 = DllCall("User32.dll", "BOOL", "CloseTouchInputHandle", "HANDLE", $lParam)
        ;GUICtrlSetData($iMemo, "Func1 Ret: " & $aRet1[0] & @CRLF, 1)
        ;$TouchInfo = 0
        Return $GUI_RUNDEFMSG
     EndFunc   ;==>WM_NOTIFY
    Alles anzeigen

    Die WM-TOUCH Funktion funktioniert grundsätzlich. Jedoch ist die Zeile

    Code
    For $i = 0 To (Int($wParam)-1) Step 1

    problematisch, weil

    Code
    Int($wParam)

    immer 1 gibt. D.h. hier kann keine Schleifenverarbeitung stattfinden, soweit ich das sehe. Hat jemand eine Idee?

    Ansonsten: Frohe Weihnachten!

    Dank und Gruß

    Thomas

  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 24. September 2017 um 16:59

    Hier noch ein Beispiel (File und GuiScroll.au3 angehängt):

    C
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>
    #include <GUIScrollBars.au3>
    #include <ScrollBarConstants.au3>
    #include <ListViewConstants.au3>
    #include <SendMessage.au3>
    #include "GuiScroll.au3" ; -> http://autoit.de/index.php?page=Thread&postID=162464#post162464
    
    startGui()
    
    Func startGui()
        $Gui = GUICreate("", 700, 600, -1, -1, $WS_POPUP)
        $up = GUICtrlCreateButton("UP", 10, 10, 80, 40)
        $down = GUICtrlCreateButton("DOWN", 100, 10, 80, 40)
        GUICtrlCreateLabel("Schliessen mit ESC", 550, 10, 120, 40)
        GUIRegisterMsg($WM_MOUSEWHEEL, "_Scrollbars_WM_MOUSEWHEEL")
        $hScrollPl = GUICreate("$hScrollPl", 500, 400, 10, 100, BitOR($WS_POPUP, $WS_GROUP, $WM_VSCROLL, $WS_CLIPSIBLINGS), $WS_EX_MDICHILD, $Gui)
        GUISetBkColor(0xffffff)
        Scrollbar_Create($hScrollPl, $SB_VERT, 400)
        Scrollbar_Step(10, $hScrollPl, $SB_VERT)
        _GUIScrollBars_SetScrollInfoMax($hScrollPl, $SB_VERT, 500)
    
        $art = GUICtrlCreateLabel("", 1, 1) ; Label für folgenden Focus...
    
        $hListV = GUICtrlCreateListView("1|2", 100, 100, 300, 200, BitOR($LVS_REPORT, $LVS_NOCOLUMNHEADER, $LVS_SHOWSELALWAYS))
        GUISetState(@SW_SHOW, $Gui)
        GUISetState(@SW_SHOW, $hScrollPl)
        GUICtrlSetState($art, $GUI_FOCUS); Focus auf Label von $hScrollPl
        GUISwitch($Gui)
        ;GUISetState(@SW_SHOW, $Gui)
        While 1
            $iMsg3 = GUIGetMsg()
            Switch $iMsg3
                Case $GUI_EVENT_CLOSE
                    Exit
                Case $up
                    MsgBox(0, "Info", "Button up gedrückt")
                    GUICtrlSetState($art, $GUI_FOCUS); Focus auf Label von $hScrollPl
                Case $down
                    MsgBox(0, "Info", "Button down gedrückt")
                    GUICtrlSetState($art, $GUI_FOCUS); Focus auf Label von $hScrollPl
            EndSwitch
        WEnd
    EndFunc   ;==>startGui
    
    Func _Scrollbars_WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg, $lParam
        Local $i, $iDirn, $iDelta = BitShift($wParam, 16) ; Mouse wheel movement
    
        If BitAND($wParam, 0x0000FFFF) Then ; If Ctrl or Shft pressed move Horz scrollbar
            $iDirn = $SB_LINERIGHT
            If $iDelta > 0 Then $iDirn = $SB_LINELEFT
            For $i = 1 To 7
                _SendMessage($hWnd, $WM_HSCROLL, $iDirn)
            Next
        Else ; Move Vert scrollbar
            $iDirn = $SB_LINEDOWN
            If $iDelta > 0 Then $iDirn = $SB_LINEUP
            For $i = 1 To 7 ; Schleife regelt die Scroll Geschwindigkeit, je mehr Durchläufe desto schneller
                _SendMessage($hWnd, $WM_VSCROLL, $iDirn)
            Next
    
        EndIf
        Return $GUI_RUNDEFMSG
    EndFunc   ;==>_Scrollbars_WM_MOUSEWHEEL
    Alles anzeigen

    Dateien

    Scroll.zip 2,77 kB – 465 Downloads
  • WIN 10 Tablet - ScrollBar - WM_TOUCH

    • TJF
    • 18. September 2017 um 20:39

    Hallo,

    am Rechner habe ich ein scrollbares Fenster mit Scrollbalken. Drehe ich im Fensterbereich das Mausrad ist der Scrollbalken synchron. Andersherum genauso. Wenn ich auf dem Tablet im Fensterbereich mit dem Finger "scrolle" ist das asynchron zum Balken. Teile des gescrollten Fensters verschwinden auch. Das funktioniert nur einwandfrei, wenn man mit dem Finger den Scrollbalken bedient. Gibt es da Abhilfe? Hat jemand Erfahrung damit und kann mir einen Tipp geben?

    Dank und Gruß

    Thomas

  • WIN10 Tablet - Button als Taster

    • TJF
    • 18. September 2017 um 20:32

    Hallo,

    hat jemand eine Idee, wie man hier für das Tablet einen Taster hinbekommt? Das kurze Beispiel schaut am PC mit Mouseover ja schon ganz gut aus. Aber wie bekomme ich es hin, dass das auch auf dem Tablet funktioniert. Wenn man den Finger wegnimmt von dem Klick-Button, bleiben die Maus-Koordinaten fest und das Wegnehmen des Fingers zu registrieren ... ist mein Problem.

    Spoiler anzeigen
    C
    #include <GUIConstantsEx.au3>
    #include <ButtonConstants.au3>
    #include <AutoItConstants.au3>
    #include <Misc.au3>
    
    
    
    Example()
    
    Func Example()
        Local $hGUI = GUICreate("Example", 300, 200,-1,50)
        Local $hDLL = DllOpen("user32.dll")
        $navi1 = GUICtrlCreateButton("Klick mich",120, 170, 85, 25)
        Local $idClose = GUICtrlCreateButton("Close", 210, 170, 85, 25)
    
        GUISetState(@SW_SHOW, $hGUI)
    
        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE, $idClose
                    ExitLoop
    
                Case $navi1
                    MouseClick($MOUSE_CLICK_PRIMARY)
                    Do
                        MsgBox(0,"Button","",2)
                    Until Not _IsPressed(01,$hDLL); fuer Linkshaender 02
            EndSwitch
        WEnd
    
        GUIDelete($hGUI)
    
    EndFunc
    Alles anzeigen

    Dank und Gruß

    Thomas

  • MouseWheel auswerten

    • TJF
    • 4. September 2017 um 20:13

    Tausend Dank Oscar!

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™