;-- TIME_STAMP   2018-01-15 16:22:54   v 0.1

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=GuiScroll_Demo.exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

Opt('MustDeclareVars', 1)

#Region    ;************ Includes ************
#include-once
;~ #include <GUIConstantsEx.au3>
#include <GuiEdit.au3>
;~ #include <GuiScrollBars.au3>
#include <ListViewConstants.au3>
;~ #include <ScrollBarsConstants.au3>
#include <SendMessage.au3>
;~ #include <WinAPI.au3>
;~ #include <WinAPISys.au3>
;~ #include <WindowsConstants.au3>
#include "GuiScroll.au3" ; http://autoit.de/index.php?page=Thread&postID=162464#post162464
#EndRegion ;************ Includes ************

#Region    ;************ Global ************
Global $g_idMemo, $g_hMemo, $g_iMemoCount = -1, $g_hScrollGUI

Global $g_bWM_HSCROLL = False, $g_bWM_VSCROLL = False, $g_bWM_MOUSEWHEEL = False, $g_bWM_MOUSEHWHEEL = False, $g_bWM_TOUCH = False

Global $g_ifMaskH, $g_inMinH, $g_inMaxH, $g_inPageH, $g_inPosH, $g_inTrackPosH
Global $g_ifMaskV, $g_inMinV, $g_inMaxV, $g_inPageV, $g_inPosV, $g_inTrackPosV

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 $g_iSendRepeat = 7 ; Wie oft soll die ScrollMessage gesendet werden?

; Diese Konstanten sind leider noch nicht in Autoit deklariert... sonst wären sie in WindowsConstants.au3 zu finden.
Global Const $SM_MOUSEHORIZONTALWHEELPRESENT = 91 ; horizontales Mausrad ?

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 $g_iScrollGUI_Width  = 500							; Breite des Scrollfensters
Global $g_iScrollGUI_Height = 400							; Hoehe des Scrollfensters
Global $g_iScrollMinH       = 0								; Min HSCROLL-Position
Global $g_iScrollMinV       = 0								; Min VSCROLL-Position
Global $g_iScrollMaxH       = 750							; Max HSCROLL-Position
Global $g_iScrollMaxV       = 650							; Max VSCROLL-Position
Global $g_iScrollPagSizeH   = Default						; HSCROLL-PageSize (s. GuiScroll.au3)
Global $g_iScrollPagSizeV   = Default						; VSCROLL-PageSize (s. GuiScroll.au3)
Global $g_iScrollStepH      = Round($g_iScrollMaxH / 100)	; HSCROLL-Step
Global $g_iScrollStepV      = Round($g_iScrollMaxV / 100)	; VSCROLL-Step
#EndRegion    ;************ Global ************

_Main()

Func _Main()
	; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	; Create MainGUI
	; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Local $hMainGUI = GUICreate("", 920, 700, -1, -1)
	GUISetBkColor(0x7D929E, $hMainGUI)

	Local $idButton_UP = GUICtrlCreateButton("UP", 10, 10, 240, 40)
	Local $idButton_DOWN = GUICtrlCreateButton("DOWN", 265, 10, 240, 40)

	$g_idMemo = GUICtrlCreateEdit("", 515, 10, 400, 680, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY, $WS_VSCROLL))
	$g_hMemo = GUICtrlGetHandle($g_idMemo)
	GUICtrlSetFont(-1, 8, 500, 0, 'Courier New')
	GUICtrlSetColor(-1, 0xDDF2FE)
	GUICtrlSetBkColor(-1, 0x5D727E)

	; Die _GUICtrlEdit_SetLimitText Function begrenzt nur den Text den der Benutzer eingeben kann.
	; Es hat keinen Einfluss auf den Text der bereits in dem Edit-Control steht, wenn die Nachricht gesendet wird. Auch hat es keinen Einfluss auf die Länge des Textes, der durch die _GUICtrlEdit_SetText Funktion in das Edit-Control kopiert wurde.
	; Wenn eine Anwendung die _GUICtrlEdit_SetText Funktion verwendet, um mehr Text in dem Edit-Control zu platzieren, dann wird in der _GUICtrlEdit_SetLimitText Funktion festgelegt, ob der Benutzer den kompletten Inhalt des Edit-Controls ändern kann.
	_GUICtrlEdit_SetLimitText($g_hMemo, 0x7FFFFFFF) ; 0x7FFFFFFF = 2147483647, 0x80000000 = -2147483648
	Local $iLimit = _GUICtrlEdit_GetLimitText($g_hMemo)

	If _WinAPI_GetSystemMetrics($SM_MOUSEWHEELPRESENT) Then ; vertikales Mausrad ?
		Local $iRegWheel = GUIRegisterMsg($WM_MOUSEWHEEL, "_Scrollbars_WM_MOUSEWHEEL")
		$g_bWM_MOUSEWHEEL = ($iRegWheel = 1)
	EndIf
	If _WinAPI_GetSystemMetrics($SM_MOUSEHORIZONTALWHEELPRESENT) Then ; horizontales Mausrad ?
		Local $iRegWheelH = GUIRegisterMsg($WM_MOUSEHWHEEL, "_Scrollbars_WM_MOUSEWHEEL") ; $WM_MOUSEHWHEEL ist nicht in AutoIt-Hilfe zu finden, aber in WindowsConstants.au3 deklariert!
		$g_bWM_MOUSEHWHEEL = ($iRegWheelH = 1)
	EndIf

	; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	; Create ScrollGUI
	; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	$g_hScrollGUI = GUICreate("$g_hScrollGUI", $g_iScrollGUI_Width, $g_iScrollGUI_Height, 10, 150, BitOR($WS_POPUP, $WS_GROUP, $WM_VSCROLL, $WS_CLIPSIBLINGS), $WS_EX_MDICHILD, $hMainGUI)
	GUISetBkColor(0xADC2DE, $g_hScrollGUI)

	Local $idLabel_Focus = GUICtrlCreateLabel("", 1, 1) ; Dummy-Label, dass den Focus bekommt...

	Local $idListView = GUICtrlCreateListView("1          |2        |3        ", 100, 100, 300, 200, BitOR($LVS_REPORT, $LVS_NOCOLUMNHEADER, $LVS_SHOWSELALWAYS))
	GUICtrlSetColor(-1, 0xDDF2FE)
	GUICtrlSetBkColor(-1, 0x5D727E)
	Local $idItem1 = GUICtrlCreateListViewItem("Eintrag 1|Spalte 22|Spalte 23", $idListview)
	Local $idItem2 = GUICtrlCreateListViewItem("Eintrag 2|Spalte 12|Spalte 13", $idListview)
	Local $idItem3 = GUICtrlCreateListViewItem("Eintrag 3|Spalte 32|Spalte 33", $idListview)

	Local $iMaxH, $iMaxV

	; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	; Horizontal scrollen
	; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	$iMaxH = Scrollbar_Create($g_hScrollGUI, $SB_HORZ, $g_iScrollMinH, $g_iScrollMaxH) ; , $g_iScrollPagSizeX)
	$g_bWM_HSCROLL = (BitAND(@extended, 1) = 1)
	Scrollbar_Step($g_iScrollStepH, $g_hScrollGUI, $SB_HORZ)
;~ 	ConsoleWrite('> $iMaxH = ' & $iMaxH & @CRLF)

	; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	; Vertikal scrollen
	; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	$iMaxV = Scrollbar_Create($g_hScrollGUI, $SB_VERT, $g_iScrollMinV, $g_iScrollMaxV) ; , $g_iScrollPagSizeV)
	$g_bWM_VSCROLL = (BitAND(@extended, 2) = 2)
	Scrollbar_Step($g_iScrollStepV, $g_hScrollGUI, $SB_VERT)
;~ 	ConsoleWrite('> $iMaxV = ' & $iMaxV & @CRLF)

	$g_iScrollPagSizeH = _GUIScrollBars_GetScrollInfoPage($g_hScrollGUI, $SB_HORZ)
	$g_iScrollPagSizeV = _GUIScrollBars_GetScrollInfoPage($g_hScrollGUI, $SB_VERT)

	Local $sInfo = _GET_DIGITIZER_INFO(), $iError = @error

	_Memo($sInfo)

	Local $iRegTouch
	If Not $iError Then
;~ 		$hDLL = DllCall("User32.dll", "BOOL", "RegisterTouchWindow", "HWND", $g_hScrollGUI, "ULONG", 2) ; $g_hScrollGUI als TouchWindow registrieren	<-- Quatsch! --> DllCall() gibt kein Handle, sondern ein Array zurück!
		Local $aRet = DllCall("User32.dll", "BOOL", "RegisterTouchWindow", "HWND", $g_hScrollGUI, "ULONG", 2) ; $g_hScrollGUI als TouchWindow registrieren
		; $aRet[0] = Rückgabewert der Funktion	("BOOL"		--> 1, wenn es funktioniert hat, sonst 0)
		; $aRet[1] = 1 Parameter				("HWND"		--> $g_hScrollGUI)
		; $aRet[2] = 2 Parameter				("ULONG"	--> 2)
		If Not @error And UBound($aRet) And $aRet[0] Then
			_Memo('$g_hScrollGUI is now registered as TouchWindow!')

			$iRegTouch = GUIRegisterMsg($WM_TOUCH, "_Scrollbars_WM_TOUCH") ; die Funktion _Scrollbars_WM_TOUCH2 für die Verarbeitung von $WM_TOUCH-Messages registrieren
			If $iRegTouch Then
				_Memo('$WM_TOUCH is now registered to _Scrollbars_WM_TOUCH2!')
			Else
				_Memo('$WM_TOUCH could not be registered!')
			EndIf
		Else
			_Memo('$g_hScrollGUI could not be registered as TouchWindow!')
		EndIf
	EndIf
	$g_bWM_TOUCH = ($iRegTouch = 1)

	Local $tScrollInfoH = _GUIScrollBars_GetScrollInfoEx($g_hScrollGUI, $SB_HORZ)
	$g_ifMaskH     = DllStructGetData($tScrollInfoH, 'fMask')
	$g_inMinH      = DllStructGetData($tScrollInfoH, 'nMin')
	$g_inMaxH      = DllStructGetData($tScrollInfoH, 'nMax')
	$g_inPageH     = DllStructGetData($tScrollInfoH, 'nPage')
	$g_inPosH      = DllStructGetData($tScrollInfoH, 'nPos')
	$g_inTrackPosH = DllStructGetData($tScrollInfoH, 'nTrackPos')

	Local $tScrollInfoV = _GUIScrollBars_GetScrollInfoEx($g_hScrollGUI, $SB_VERT)
	$g_ifMaskV     = DllStructGetData($tScrollInfoV, 'fMask')
	$g_inMinV      = DllStructGetData($tScrollInfoV, 'nMin')
	$g_inMaxV      = DllStructGetData($tScrollInfoV, 'nMax')
	$g_inPageV     = DllStructGetData($tScrollInfoV, 'nPage')
	$g_inPosV      = DllStructGetData($tScrollInfoV, 'nPos')
	$g_inTrackPosV = DllStructGetData($tScrollInfoV, 'nTrackPos')

	Local $sLimit = FileGetEncoding(@ScriptFullPath) = $FO_ANSI ? 'Bytes' : 'Zeichen'

	Local $sMessage

	$sMessage &= StringFormat( _
		'----------- GENERAL_INFO -----------\r\n' & _
		'Memo-Textlimit       = %i %s\r\n\r\n' & _
		'$g_iSendRepeat       = %i\r\n\r\n' & _
		'$g_bWM_HSCROLL       = %s\r\n' & _
		'$g_bWM_VSCROLL       = %s\r\n' & _
		'$g_bWM_MOUSEWHEEL    = %s\r\n' & _
		'$g_bWM_MOUSEHWHEEL   = %s\r\n' & _
		'$g_bWM_TOUCH         = %s\r\n\r\n' & _
		'$g_iScrollGUI_Width  = %i\r\n' & _
		'$g_iScrollGUI_Height = %i\r\n' & _
		'$g_iScrollMinH       = %i\r\n' & _
		'$g_iScrollMinV       = %i\r\n' & _
		'$g_iScrollMaxH       = %i\r\n' & _
		'$g_iScrollMaxV       = %i\r\n' & _
		'$g_iScrollPagSizeH   = %i\r\n' & _
		'$g_iScrollPagSizeV   = %i\r\n' & _
		'$g_iScrollStepH      = %i\r\n' & _
		'$g_iScrollStepV      = %i\r\n\r\n' & _
		'$SB_LINEUP           = %i\r\n' & _
		'$SB_LINEDOWN         = %i\r\n' & _
		'$SB_LINELEFT         = %i\r\n' & _
		'$SB_LINERIGHT        = %i\r\n\r\n', _
		$iLimit, $sLimit, _
		$g_iSendRepeat, _
		$g_bWM_HSCROLL, $g_bWM_VSCROLL, $g_bWM_MOUSEWHEEL, $g_bWM_MOUSEHWHEEL, $g_bWM_TOUCH, _
		$g_iScrollGUI_Width, $g_iScrollGUI_Height, $g_iScrollMinH, $g_iScrollMinV, $g_iScrollMaxH, $g_iScrollMaxV, $g_iScrollPagSizeH, $g_iScrollPagSizeV, $g_iScrollStepH, $g_iScrollStepV, _
		$SB_LINEUP, $SB_LINEDOWN, $SB_LINELEFT, $SB_LINERIGHT)

	$sMessage &= StringFormat( _
		'----------- ScrollH_INFO -----------\r\n' & _
		'$g_ifMaskH           = %i\r\n' & _
		'$g_inMinH            = %i\r\n' & _
		'$g_inMaxH            = %i\r\n' & _
		'$g_inPageH           = %i\r\n' & _
		'$g_inPosH            = %i\r\n' & _
		'$g_inTrackPosH       = %i\r\n\r\n', _
		$g_ifMaskH, $g_inMinH, $g_inMaxH, $g_inPageH, $g_inPosH, $g_inTrackPosH)

	$sMessage &= StringFormat( _
		'----------- ScrollV_INFO -----------\r\n' & _
		'$g_ifMaskV           = %i\r\n' & _
		'$g_inMinV            = %i\r\n' & _
		'$g_inMaxV            = %i\r\n' & _
		'$g_inPageV           = %i\r\n' & _
		'$g_inPosV            = %i\r\n' & _
		'$g_inTrackPosV       = %i\r\n' & _
		'====================================\r\n\r\n', _
		$g_ifMaskV, $g_inMinV, $g_inMaxV, $g_inPageV, $g_inPosV, $g_inTrackPosV)

	_Memo($sMessage)

	$g_iMemoCount = 0

	GUISetState(@SW_SHOW, $hMainGUI)
	GUISetState(@SW_SHOW, $g_hScrollGUI)

	GUICtrlSetState($idLabel_Focus, $GUI_FOCUS); Focus auf Label von $g_hScrollGUI

	GUISwitch($hMainGUI)

	; Damit ich $WM_TOUCH bei mir testen kann
	Local $idDummy_UP    = GUICtrlCreateDummy()
	Local $idDummy_DOWN  = GUICtrlCreateDummy()
	Local $idDummy_LEFT  = GUICtrlCreateDummy()
	Local $idDummy_RIGHT = GUICtrlCreateDummy()

	Local $iAccelerators, $aAccelKeys[4][2] = [["{UP}", $idDummy_UP], ["{DOWN}", $idDummy_DOWN], ["{LEFT}", $idDummy_LEFT], ["{RIGHT}", $idDummy_RIGHT]]
	$iAccelerators = GUISetAccelerators($aAccelKeys, $hMainGUI)
;~ 	ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & "   var: $iAccelerators --> " & $iAccelerators & @CRLF)
	$iAccelerators = GUISetAccelerators($aAccelKeys, $g_hScrollGUI)
;~ 	ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & "   var: $iAccelerators --> " & $iAccelerators & @CRLF)

	;_GUIScrollBars_Init($g_hScrollGUI)
	;_GUIScrollBars_SetScrollInfoPos($g_hScrollGUI,$SB_VERT,100)
	;_GUIScrollBars_ScrollWindow($g_hScrollGUI,0,200); bewegt nur das Fenster - nicht die Scrollbar

	;Scrollbar_Scroll($g_hScrollGUI, $SB_VERT, 250); scrollt um ...

    While 1
        Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
;~ 				DllClose($hDLL)	; <-- Quatsch! --> DllClose wird benötigt, wenn zuvor mit DllOpen() ein Handle geholt wurde!
                Exit

			Case $idDummy_UP
;~ 				ConsoleWrite('Case $idDummy_UP' & @CRLF)
				_Scrollbars_WM_TOUCH($g_hScrollGUI, -1, 0x00000001, _GetPos(1)) ; $iMsg, $wParam, $lParam)
			Case $idDummy_DOWN
;~ 				ConsoleWrite('Case $idDummy_DOWN' & @CRLF)
				_Scrollbars_WM_TOUCH($g_hScrollGUI, -1, 0x00000001, _GetPos(2)) ; $iMsg, $wParam, $lParam)
			Case $idDummy_LEFT
;~ 				ConsoleWrite('Case $idDummy_LEFT' & @CRLF)
				_Scrollbars_WM_TOUCH($g_hScrollGUI, -1, 0x00000001, _GetPos(3)) ; $iMsg, $wParam, $lParam)
			Case $idDummy_RIGHT
;~ 				ConsoleWrite('Case $idDummy_RIGHT' & @CRLF)
				_Scrollbars_WM_TOUCH($g_hScrollGUI, -1, 0x00000001, _GetPos(4)) ; $iMsg, $wParam, $lParam)

			Case $idButton_UP
                GUICtrlSetState($idLabel_Focus, $GUI_FOCUS); Focus auf Label von $g_hScrollGUI
				Scrollbar_Scroll($g_hScrollGUI, $SB_VERT, 0)
				_Memo("Button $idUP gedrückt   - ScrollBarPos: " & _GUIScrollBars_GetScrollInfoPos($g_hScrollGUI,$SB_VERT))
            Case $idButton_DOWN
                GUICtrlSetState($idLabel_Focus, $GUI_FOCUS); Focus auf Label von $g_hScrollGUI
				Scrollbar_Scroll($g_hScrollGUI, $SB_VERT, $g_iScrollPagSizeV); scrollt um ...
				_Memo("Button $idDOWN gedrückt - ScrollBarPos: " & _GUIScrollBars_GetScrollInfoPos($g_hScrollGUI,$SB_VERT))
        EndSwitch
    WEnd
EndFunc   ;==>_Main

#cs	_Scrollbars_WM_TOUCH
		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.
#ce
Func _Scrollbars_WM_TOUCH($hWnd, $iMsg, $wParam, $lParam)
	#forceref $hWnd, $iMsg

	Local Static $idwID, $iX, $iY
	Local Enum $eID, $eX, $eY

	Local $iTouchPoints = BitAND($wParam, 0xFFFF) ; Anzahl der Berührungspunkte, an der das Display berührt wurde, als diese Message erstellt wurde.

	Local $sMessage

	; Es wird nur gescrollt, wenn $iTouchPoints = 1 ist - du darfst das Dispay also nur mit einem Finger berühren, wenn du scrollen willst!
	Switch $iTouchPoints
		Case 1 ; Scroll
			Local $aTouchInput[$iTouchPoints], $aPoints[$iTouchPoints][3] ; $idwID, $iX/100, $iY/100
			$sMessage = 'WM_TOUCH: $iTouchPoints = ' & $iTouchPoints & @CRLF

			Switch $iMsg
				Case -1
					$aPoints[0][$eID] = 123
					$aPoints[0][$eX]  = _WinAPI_HiWord($lParam)
					$aPoints[0][$eY]  = _WinAPI_LoWord($lParam)
				Case Else
					Local $iBuffer = DllStructCreate("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

					Local $aRet = DllCall("User32.dll", "BOOL", "GetTouchInputInfo", "HANDLE", $lParam, "UINT", $wParam, "ULONG_PTR", $pTouchInfo, "int", DllStructGetSize($tTouchInfo))

					$aPoints[0][$eID] = DllStructGetData($aTouchInput[0], "dwID")
					$aPoints[0][$eX]  = DllStructGetData($aTouchInput[0], "x") / 100
					$aPoints[0][$eY]  = DllStructGetData($aTouchInput[0], "y") / 100
			EndSwitch

			Local $iDirectionX, $iDirectionY
			If $idwID <> $aPoints[0][$eID] Then ; dann neue ID und Startpunkte merken und auf nächste Message warten
				$sMessage &= '$idwID <> $aPoints[0][$eID]' & @CRLF
				$idwID = $aPoints[0][$eID]
				$iX    = $aPoints[0][$eX]
				$iY    = $aPoints[0][$eY]
			Else
				If $g_bWM_HSCROLL Then ; $WM_HSCROLL registriert ?
					$iDirectionX = ($iX = $aPoints[0][$eX] ? -1 : $iX > $aPoints[0][$eX] ? $SB_LINELEFT : $SB_LINERIGHT)	; Wenn $iDirectionX > -1 ist, dann müssen wir horizontal scrollen!
					If $iDirectionX > -1 Then $sMessage &= '_SendMessage($WM_HSCROLL) Direction: ' & ($iDirectionX = $SB_LINEUP ? 'right' : 'left') & @CRLF
				Else
					$sMessage &= 'WM_HSCROLL is not registered!' & @CRLF
				EndIf
				If $g_bWM_VSCROLL Then ; $WM_VSCROLL registriert ?
					$iDirectionY = ($iY = $aPoints[0][$eY] ? -1 : $iY > $aPoints[0][$eY] ? $SB_LINEUP : $SB_LINEDOWN)		; Wenn  $iDirection > -1 ist, dann müssen wir vertikal scrollen!
					If $iDirectionY > -1 Then $sMessage &= '_SendMessage($WM_VSCROLL) Direction: ' & ($iDirectionY = $SB_LINERIGHT ? 'up' : 'down') & @CRLF
				Else
					$sMessage &= 'WM_VSCROLL is not registered!' & @CRLF
				EndIf

				$sMessage &= StringFormat( _
					'$idwID           = %i\r\n' & _
					'$iDirectionX     = %i\r\n' & _
					'$iDirectionY     = %i\r\n' & _
					'$aPoints[0][$eX] = %i\r\n' & _
					'$aPoints[0][$eY] = %i\r\n' & _
					'$iX              = %i\r\n' & _
					'$iY              = %i\r\n', _
					$idwID, $iDirectionX, $iDirectionY, $aPoints[0][$eX], $aPoints[0][$eY], $iX, $iY)

				If $iDirectionX > -1 Or $iDirectionY > -1 Then
					For $i = 1 To $g_iSendRepeat ; Diese Schleife regelt die Scrollgeschwindigkeit... je mehr Durchläufe, desto schneller.
						If $iDirectionX > -1 Then _SendMessage($hWnd, $WM_HSCROLL, $iDirectionX) ; horizontal scrollen (rechts, links)
						If $iDirectionY > -1 Then _SendMessage($hWnd, $WM_VSCROLL, $iDirectionY) ; vertikal scrollen (oben, unten)
					Next
				EndIf
			EndIf

			_Memo($sMessage)

			$iX = $aPoints[0][$eX] ; neue Position merken
			$iY = $aPoints[0][$eY] ; neue Position merken

			Return 0
		Case 2 ; Zoom
			; Add your code here...

			Return 0
		Case Else
			; Add your code here...

			; If the application does not process the message, it must call DefWindowProc.
			; Not doing so causes the application to leak memory because the touch input handle is not closed and associated process memory is not freed.
			Return $GUI_RUNDEFMSG
	EndSwitch
EndFunc   ;==>_Scrollbars_WM_TOUCH


#cs	_Scrollbars_WM_MOUSEWHEEL
		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.

		Wichtig: Verwenden Sie nicht die Makros LOWORD oder HIWORD, um die X- und Y-Koordinaten der Cursorposition zu extrahieren, da diese Makros auf Systemen mit mehreren Monitoren falsche Ergebnisse liefern. Systeme mit mehreren Monitoren können negative X- und Y-Koordinaten haben, und LOWORD und HIWORD behandeln die Koordinaten als vorzeichenlose Größen.
#ce
Func _Scrollbars_WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
    Local $sMessage, $iScrollPosH, $iScrollPosV, $iDirection, $iDelta = BitShift($wParam, 16) ; Mouse wheel movement

    If BitAND($wParam, 0x0000FFFF) Then ; If Ctrl or Shift pressed move Horz scrollbar
        If $g_bWM_HSCROLL Then ; $WM_HSCROLL registriert ?
			$iDirection = $SB_LINERIGHT
			If $iDelta > 0 Then $iDirection = $SB_LINELEFT
;~ 			$iScrollPosH = _GUIScrollBars_GetScrollInfoPos($g_hScrollGUI, $SB_HORZ)
			$iScrollPosH = _GUIScrollBars_GetScrollInfoTrackPos($g_hScrollGUI, $SB_HORZ)
			$sMessage = StringFormat("WM_MOUSEWHEEL: Direction: %s\r\n$i: - HScrollBarPos: %5i [before _SendMessage($WM_HSCROLL)]\r\n", ($iDirection = $SB_LINERIGHT ? 'right' : 'left'), $iScrollPosH)
			For $i = 1 To 7
				_SendMessage($hWnd, $WM_HSCROLL, $iDirection)
			Next
;~ 			$iScrollPosH = _GUIScrollBars_GetScrollInfoPos($g_hScrollGUI, $SB_HORZ)
			$iScrollPosH = _GUIScrollBars_GetScrollInfoTrackPos($g_hScrollGUI, $SB_HORZ)
			$sMessage &= StringFormat("$i: %i HScrollBarPos: %5i [after  _SendMessage($WM_HSCROLL)]\r\n", $i, $iScrollPosH)
			_Memo($sMessage)
		Else
			_Memo('WM_HSCROLL is not registered!')
		EndIf
    Else ; Move Vert scrollbar
        If $g_bWM_VSCROLL Then ; $WM_VSCROLL registriert ?
			$iDirection = $SB_LINEDOWN
			If $iDelta > 0 Then $iDirection = $SB_LINEUP
;~ 			$iScrollPosV = _GUIScrollBars_GetScrollInfoPos($g_hScrollGUI, $SB_VERT)
			$iScrollPosV = _GUIScrollBars_GetScrollInfoTrackPos($g_hScrollGUI, $SB_VERT)
			$sMessage = StringFormat("WM_MOUSEWHEEL: Direction: %s\r\n$i: - VScrollBarPos: %5i [before _SendMessage($WM_VSCROLL)]\r\n", ($iDirection = $SB_LINEUP ? 'up' : 'down'), $iScrollPosV)
			For $i = 1 To 7 ; Schleife regelt die Scroll Geschwindigkeit, je mehr Durchläufe desto schneller
				_SendMessage($hWnd, $WM_VSCROLL, $iDirection)
			Next
;~ 			$iScrollPosV = _GUIScrollBars_GetScrollInfoPos($g_hScrollGUI, $SB_VERT)
			$iScrollPosV = _GUIScrollBars_GetScrollInfoTrackPos($g_hScrollGUI, $SB_VERT)
			$sMessage &= StringFormat("$i: %i VScrollBarPos: %5i [after  _SendMessage($WM_HSCROLL)]\r\n", $i, $iScrollPosV)
			_Memo($sMessage)
		Else
			_Memo('WM_VSCROLL is not registered!')
		EndIf
    EndIf
;~ 	_Memo('')
;~     Return $GUI_RUNDEFMSG
EndFunc   ;==>_Scrollbars_WM_MOUSEWHEEL


Func _Scrollbars_WM_MOUSEHWHEEL($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
    Local $sMessage, $iScrollPosH, $iScrollPosV, $iDirection, $iDelta = BitShift($wParam, 16) ; Mouse wheel movement

	If $g_bWM_HSCROLL Then ; $WM_HSCROLL registriert ?
		$iDirection = $SB_LINERIGHT
		If $iDelta > 0 Then $iDirection = $SB_LINELEFT
;~ 		$iScrollPosH = _GUIScrollBars_GetScrollInfoPos($g_hScrollGUI, $SB_HORZ)
		$iScrollPosH = _GUIScrollBars_GetScrollInfoTrackPos($g_hScrollGUI, $SB_HORZ)
		$sMessage = StringFormat("WM_MOUSEHWHEEL: Direction: %s\r\n$i: - HScrollBarPos: %5i [before _SendMessage($WM_HSCROLL)]\r\n", ($iDirection = $SB_LINERIGHT ? 'right' : 'left'), $iScrollPosH)
		For $i = 1 To 7
			_SendMessage($hWnd, $WM_HSCROLL, $iDirection)
		Next
;~ 		$iScrollPosH = _GUIScrollBars_GetScrollInfoPos($g_hScrollGUI, $SB_HORZ)
		$iScrollPosH = _GUIScrollBars_GetScrollInfoTrackPos($g_hScrollGUI, $SB_HORZ)
		$sMessage &= StringFormat("$i: %i HScrollBarPos: %5i [after  _SendMessage($WM_HSCROLL)]\r\n", $i, $iScrollPosH)
		_Memo($sMessage)
	Else
		_Memo('WM_HSCROLL is not registered!')
	EndIf
EndFunc   ;==>_Scrollbars_WM_MOUSEWHEEL


Func _Memo($sMessage)
	;~ 	GUICtrlSetData			- Der Text wird an der Caret-Position eingefügt... evtl. nicht erwünscht, wenn man in das Edit-Control geklickt hat.
	; _GUICtrlEdit_AppendText	- Der Text wird immer an das Ende des bereits vorhandenen Textes angefügt.

	$sMessage &= @CRLF
	If $g_iMemoCount = -1 Then
		_GUICtrlEdit_AppendText($g_hMemo, $sMessage)
	Else
		$g_iMemoCount += 1
		_GUICtrlEdit_AppendText($g_hMemo, StringRegExpReplace($sMessage, '(\R)', '\1$g_iMemoCount    = ' & $g_iMemoCount & @CRLF, 1))
	EndIf
EndFunc   ;==>MemoWrite


Func _GetPos($iMove)
	Local Static $h = 0, $v = 0

	Switch $iMove
		Case 1		; UP
			$v -= $g_iScrollStepV
		Case 2		; DOWN
			$v += $g_iScrollStepV
		Case 3		; LEFT
			$h -= $g_iScrollStepH
		Case Else	; RIGHT
			$h += $g_iScrollStepH
	EndSwitch

	$h = $h < 0 ? 0 : $h >= $g_inMaxH + $g_iScrollStepH ? $g_inMaxH + $g_iScrollStepH : $h
	$v = $v < 0 ? 0 : $v >= $g_inMaxV + $g_iScrollStepV ? $g_inMaxV + $g_iScrollStepV : $v
;~ 	ConsoleWrite('- $h = ' & $h & @CRLF)
;~ 	ConsoleWrite('- $v = ' & $v & @CRLF)

	Return '0x' & Hex($h, 4) & Hex($v, 4)
EndFunc


Func _GET_DIGITIZER_INFO()
	; Nonzero if the current operating system is Windows 7 or Windows Server 2008 R2 and the Tablet PC Input service is started; otherwise, 0.
	; The return value is a bitmask that specifies the type of digitizer input supported by the device.
	Local $iSM_DIGITIZER = _WinAPI_GetSystemMetrics($SM_DIGITIZER)
;~ 	Local $iSM_DIGITIZER = BitOR($NID_INTEGRATED_TOUCH, $NID_INTEGRATED_PEN, $NID_MULTI_INPUT, $NID_READY)
	Select
		Case $iSM_DIGITIZER = $TABLET_CONFIG_NONE
			Return SetError(1, 0, StringFormat('----------- DIGITIZER_INFO -------\r\nThis PC has no touch capabilities!\r\n$WM_TOUCH will not be registered!\r\n'))
		Case BitAnd($iSM_DIGITIZER, $NID_READY) = 0
			Return SetError(2, 0, StringFormat('----------- DIGITIZER_INFO -------\r\nTablet PC Input service is not started!\r\n$WM_TOUCH will not be registered!\r\n'))
		Case Else
			Local $sTOUCH = BitAND($iSM_DIGITIZER , $NID_INTEGRATED_TOUCH) = $NID_INTEGRATED_TOUCH ? 'INTEGRATED_TOUCH' : 'EXTERNAL_TOUCH'
			Local $sPEN   = BitAND($iSM_DIGITIZER , $NID_INTEGRATED_PEN) = $NID_INTEGRATED_PEN ? 'INTEGRATED_PEN' : 'EXTERNAL_PEN'
			Local $sINPUT = BitAND($iSM_DIGITIZER , $NID_MULTI_INPUT) = $NID_MULTI_INPUT ? 'MULTI_INPUT' : 'SINGLE_INPUT'
			Return StringFormat('----------- DIGITIZER_INFO -------\r\nTOUCH.... : %s\r\nPEN  .... : %s\r\nINPUT.... : %s\r\n', $sTOUCH, $sPEN, $sINPUT)
	EndSelect
EndFunc
