日常生活的交流与学习

首页 新随笔 联系 管理

autoit password book


#include <GUIConstantsEx.au3>
#include "GUIScrollbars_Ex.au3"

Global $buttonList[100] = [0]
; Create GUI with red background
$hGUI = GUICreate("PasswordBook", 400, 600)
GUISetBkColor(0xf5f5f5, $hGUI)
; To get cursor keys to scroll GUI, create controls AFTER GUISetState
GUISetState()

Do
   $iCount = InputBox("Password Input", "Password","", "*", 240, 130)
	 ; if input is none or click cancel button, then exit the script
	 ; if input some password but is wrong,then repeat the password input until the password is right
	 If $iCount == '' Then 
	 	Exit
	 EndIf
Until $iCount == '你的密码'

; Create button to show scrolling
For $i = $buttonList[0] + 1 To 10
			$buttonList[$i] = GUICtrlCreateButton($i, 10, $i * 35 , 300, 30)
Next

; Generate scrollbars - Yes, this is all you need to do!!!!!!!
_GUIScrollbars_Generate($hGUI, 400, 1000)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $buttonList[1]
			MsgBox(0,'title','hello 1') 
		Case $buttonList[2]
			MsgBox(0,'title','hello 2') 
    Case $buttonList[3]
			MsgBox(0,'title','hello 3') 

	EndSwitch

	_GUIScrollbars_EventMonitor()
WEnd

GUIScrollBars_Ex.au3

#include-once

; #INDEX# ============================================================================================================
; Title .........: GUIScrollBars_Ex
; AutoIt Version : v3.3.6.0
; Language ......: English
; Description ...: Generates scrollbars for user defined sizes of GUI and aperture and sets proportional thumb sizes
; Remarks .......:
; Note ..........:
; Author(s) .....: Melba23 - with some code based on the WinAPI and GUIScrollBars includes
;                  and contributions from rover, czardas, MrCreatoR, Malkey and KaFu
; ====================================================================================================================

;#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7

; #INCLUDES# =========================================================================================================
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiScrollBars.au3>
#include <ScrollBarConstants.au3>
#include <SendMessage.au3>
#include <WinAPI.au3>

; #GLOBAL VARIABLES# =================================================================================================
Global $__g_aSB_WindowInfo[1][10] = [[0, 0, 0, 0, -1]]
; [0][0] = Count of initiated GUIs  [n][0] = Handle to window
; [0][1] = Resizing horz position   [n][1] = Not used
; [0][2] = Resizing vert position   [n][2] = Average horizontal pixels per char
; [0][3] = Resizing GUI handle      [n][3] = Vertical pixels per char
; [0][4] = Resizing GUI index       [n][4] = Client area width
; [0][5] = Width of VScrollbar      [n][5] = Client area height
; [0][6] = Height of HScrollbar     [n][6] = Horizontal max setting
; [0][7] = Non-minimized event flag [n][7] = Vertical max setting
;                                   [n][8] = Vertical scrollbar position for minimize/restore
;                                   [n][9] = Horizontal scrollbar position for minimize/restore
$__g_aSB_WindowInfo[0][5] = _WinAPI_GetSystemMetrics(2) ; Width of VScrollbar:  SM_CXVSCROLL
$__g_aSB_WindowInfo[0][6] = _WinAPI_GetSystemMetrics(3) ; Height of HScrollbar: SM_CYHSCROLL
Global $__g_aSB_WindowInfoEx[1][11]
; [n][0] = Horizontal scrollable size
; [n][1] = Vertical scrollable size
; [n][2] = Width correction factor
; [n][3] = Height correction factor
; [n][4] = Before/After flag
; [n][5] = Key repeat value
; [n][6] = Wheel scroll value
; [n][7] = Max horz scroll size if resizeable
; [n][8] = Max vert scroll size if resizeable
; [n][9] = Minimized flag

; #CURRENT# ==========================================================================================================
; _GUIScrollbars_Generate:     Generates scrollbars for a GUI with a defined aperture and registers required handlers
; _GUIScrollbars_ReSizer:      Registers required handlers and optionally creates GUI at max scrollable size
; _GUIScrollbars_Locate_Ctrl:  Calculates coordinates to use to position controls after scrollbar creation
; _GUIScrollbars_Scroll_Page:  Scrolls to min, max or page number
; _GUIScrollbars_EventMonitor: Save and restores scrollbar positions on GUI minimize/restore
; ====================================================================================================================

; #INTERNAL_USE_ONLY#=================================================================================================
; __Scrollbars_WM_VSCROLL:       Handler for vertical scrollbar
; __Scrollbars_WM_HSCROLL:       Handler for horizontal scrollbar
; __Scrollbars_WM_MOUSEWHEEL:    Handler for vertical mouse wheel scroll
; __Scrollbars_WM_MOUSEHWHEEL:   Handler for horizontal mouse wheel scroll
; __Scrollbars_WM_KEYUP:         Handler for scrolling on cursor, pageup/down, home and end key press
; __Scrollbars_WM_ENTERSIZEMOVE: Handler for detecting when GUI resizing is started
; __Scrollbars_WM_EXITSIZEMOVE:  Handler for detecting when GUI resizing is complete
; __Scrollbars_WM_SIZE:          Handler for detecting when GUI enters/exits minimized state
;=====================================================================================================================

; #FUNCTION# =========================================================================================================
; Name...........: _GUIScrollbars_Generate
; Description ...: Generates scrollbars for a GUI with a defined aperture with proportional thumb sizes
; Syntax.........: _GUIScrollbars_Generate ($hWnd, $iH_Scroll = 0, [$iV_Scroll = 0, [$iH_Tight = 0, [$iV_Tight = 0, [$fBefore = False, [$iRepeat = 0 [, $bRegisterMsg = True]]]]]])
; Parameters ....: $hWnd         -> GUI to contain scrollbars
;                  $iH_Scroll    -> Width in pixels of area to be scrolled
;                  $iV_Scroll    -> Height in pixels of area to be scrolled (default = 0)
;                  $iH_Tight     -> 1 = Adjust mean position of right edge of scrolled area to right (default = 0)
;                  $iV_Tight     -> 1 = Adjust mean position of bottom edge of scrolled area down (default = 0)
;                  $fBefore      -> True  = Scrollbars are being generated BEFORE controls
;                                   False = Scrollbars are being generated AFTER controls (default) - key scrolling possible
;                  $iRepeat      -> Number of lines/chars moved by a single cursor key press - default 0
;                  $bRegisterMsg -> True (default) = register WM_VSCROLL, WM_HSCROLL, WM_MOUSEWHEEL, WM_MOUSEHWHEEL & WM_KEYUP handlers
;                                   False = do not register handlers
; Requirement(s).: v3.3.6.0 or higher
; Return values .: Success - Returns a 4-element array (see remarks for details):
;                            [0] = Actual aperture width ; [1] = Actual aperture height]
;                            [2] = Width correction factor ; [3] = Height correction factor]
;                  Failure - Returns either 0 (UDF error) or negative integer (API error)
;                            If UDF error then @error set as follows:
;                               1 - hWnd not a valid handle
;                               2 - No scroll size parameters
;                               3 - Scrollbar creation or parameter setting failure
;                            If API error then @error and @extended as set by API error.  Return values:
;                               -1 - GetDC failure
;                               -2 - GetTextMetricsW failure
;                               -3 - GetClientRect failure
; Remarks .......; - The $fBefore parameter is needed because of the way Windows deals with scrollbars.  When the
;                    scrollbars are generated, the visible part of the scrollable GUI resizes to fit the in the
;                    remaining (smaller) client area.
;                    - If the scrollbars are generated BEFORE any controls, the UDF should be called with the
;                      $fBefore parameter set.  The new client size of the aperture window is returned so that
;                      controls can then be created using these values.
;                    - If controls have been created before the scrollbars are generated then the UDF should be
;                      called without the $fBefore parameter.  The correction factors returned can then be applied to
;                      any subsequent control positioning and sizing.  This is necessary because of the positions and
;                      sizes of existing controls will be slightly altered as the scrollbars are generated and the GUI
;                      resized.  Any controls created subsequently would therefore be slightly misplaced in relation
;                      to the existing ones unless the correction factors are used when positoning and sizing them.
;                    - If existing controls were fixed in place using GUICtrlResizing($GUI_DOCKALL) there is no need
;                      to apply the correction factors as the controls will not have moved with the GUI resizing.
;                  - If a value is set for $iRepeat then the UDF will register the WM_KEYUP message to allow scrolling
;                    with the cursor, pageup/down, home and end keys. Note that in this case any controls must be created
;                    after the GUISetState(@SW_SHOW) line or the key scrolling will not be activated
;                  - If there are existing message handlers for the WM_SIZE, WM_VSCROLL, WM_HSCROLL, WM_MOUSEWHEEL, WM_MOUSEHWHEEL & WM_KEYUP
;                    messages then $bMessageReg must be set to False and the relevant handler function(s) added to these handlers
;                    or registered separately
; Author ........: Melba23 - with some code based on the WinAPI and GUIScrollBars includes
; Example........; Yes
;=====================================================================================================================
Func _GUIScrollbars_Generate($hWnd, $iH_Scroll = 0, $iV_Scroll = 0, $iH_Tight = 0, $iV_Tight = 0, $fBefore = False, $iRepeat = 0, $bRegisterMsg = True)

	Local $iIndex

	; Check if valid window handle
	If Not IsHWnd($hWnd) Then Return SetError(1, 0, 0)

	; Search for existing GUI
	For $iIndex = 1 To $__g_aSB_WindowInfo[0][0]
		If $hWnd = $__g_aSB_WindowInfo[$iIndex][0] Then
			ExitLoop
		EndIf
	Next

	If $iIndex > $__g_aSB_WindowInfo[0][0] Then
		$__g_aSB_WindowInfo[0][0] += 1
		ReDim $__g_aSB_WindowInfo[$iIndex + 1][UBound($__g_aSB_WindowInfo, 2)]
		ReDim $__g_aSB_WindowInfoEx[$iIndex + 1][UBound($__g_aSB_WindowInfoEx, 2)]
	EndIf

	; If no scroll sizes set, return error
	If $iH_Scroll = 0 And $iV_Scroll = 0 Then Return SetError(2, 0, 0)

	; Confirm Tight values
	If $iH_Tight <> 0 Then $iH_Tight = 1
	If $iV_Tight <> 0 Then $iV_Tight = 1

	; Check Repeat value
	If Not IsInt($iRepeat) Then $iRepeat = 0

	; Create structs
	Local $tTEXTMETRIC = DllStructCreate($tagTEXTMETRIC)
	Local $tSCROLLINFO = DllStructCreate($tagSCROLLINFO)
	DllStructSetData($tSCROLLINFO, "cbSize", DllStructGetSize($tSCROLLINFO))
	;Local $tRect = DllStructCreate($tagRECT)

	; Declare local variables
	Local $iError, $iExtended

	; Save window handle
	$__g_aSB_WindowInfo[$iIndex][0] = $hWnd

	; Save scrollbar visible state
	Local $aVis[2] = [(($iH_Scroll = 0) ? (False) : (True)), (($iV_Scroll = 0) ? (False) : (True))]
	$__g_aSB_WindowInfo[$iIndex][1] = $aVis

	; Determine text size
	Local $hDC = DllCall("user32.dll", "handle", "GetDC", "hwnd", $hWnd)
	If Not @error Then
		$hDC = $hDC[0]
		DllCall("gdi32.dll", "bool", "GetTextMetricsW", "handle", $hDC, "ptr", DllStructGetPtr($tTEXTMETRIC))
		If @error Then
			$iError = @error
			$iExtended = @extended
			DllCall("user32.dll", "int", "ReleaseDC", "hwnd", $hWnd, "handle", $hDC)
			Return SetError($iError, $iExtended, -2)
		EndIf
		DllCall("user32.dll", "int", "ReleaseDC", "hwnd", $hWnd, "handle", $hDC)
	Else
		Return SetError(@error, @extended, -1)
	EndIf
	$__g_aSB_WindowInfo[$iIndex][2] = DllStructGetData($tTEXTMETRIC, "tmAveCharWidth")
	$__g_aSB_WindowInfo[$iIndex][3] = DllStructGetData($tTEXTMETRIC, "tmHeight") + DllStructGetData($tTEXTMETRIC, "tmExternalLeading")

	; Size aperture window without bars
	Local $aClientSize = WinGetClientSize($hWnd)
	Local $iX_Client_Full = $aClientSize[0]
	Local $iY_Client_Full = $aClientSize[1]
	$__g_aSB_WindowInfo[$iIndex][4] = $iX_Client_Full
	$__g_aSB_WindowInfo[$iIndex][5] = $iY_Client_Full

	; Is GUI already larger then max scroll size
	If $iX_Client_Full > $iH_Scroll Then $iH_Scroll = 0
	If $iY_Client_Full > $iV_Scroll Then $iV_Scroll = 0

	; Hide both scrollbars
	_GUIScrollBars_ShowScrollBar($hWnd, $SB_BOTH, False)
	; Show scrollbars and register scrollbar and mousewheel messages if required
	If $iH_Scroll Then
		_GUIScrollBars_ShowScrollBar($hWnd, $SB_HORZ)
		If $bRegisterMsg Then
			GUIRegisterMsg($WM_HSCROLL, "__Scrollbars_WM_HSCROLL")
			GUIRegisterMsg($WM_MOUSEHWHEEL, '__Scrollbars_WM_MOUSEHWHEEL')
		EndIf
	EndIf
	If $iV_Scroll Then
		_GUIScrollBars_ShowScrollBar($hWnd, $SB_VERT)
		If $bRegisterMsg Then
			GUIRegisterMsg($WM_VSCROLL, "__Scrollbars_WM_VSCROLL")
			GUIRegisterMsg($WM_MOUSEWHEEL, "__Scrollbars_WM_MOUSEWHEEL")
		EndIf
	EndIf
	; Only register for key scrolling if required
	If $iRepeat And $bRegisterMsg Then
		GUIRegisterMsg($WM_KEYUP, "__Scrollbars_WM_KEYUP")
	EndIf
	; Check for GUI being minimized by Win-D or taskbar "show desktop" button
	If $bRegisterMsg Then
		GUIRegisterMsg($WM_SIZE, "__Scrollbars_WM_SIZE")
	EndIf

	; Size aperture window with bars
	$aClientSize = WinGetClientSize($hWnd)
	Local $iX_Client_Bar = $aClientSize[0]
	Local $iY_Client_Bar = $aClientSize[1]

	; If horizontal scrollbar is required
	Local $iH_FullPage
	If $iH_Scroll Then
		If $fBefore Then
			; Use actual aperture width
			$__g_aSB_WindowInfo[$iIndex][4] = $iX_Client_Bar
			; Determine page size (aperture width / text width)
			$iH_FullPage = Floor($__g_aSB_WindowInfo[$iIndex][4] / $__g_aSB_WindowInfo[$iIndex][2])
			; Determine max size (scroll width / text width - tight)
			$__g_aSB_WindowInfo[$iIndex][6] = Floor($iH_Scroll / $__g_aSB_WindowInfo[$iIndex][2]) - $iH_Tight
		Else
			; Use reduced aperture width only if other scrollbar exists
			If $iV_Scroll Then $__g_aSB_WindowInfo[$iIndex][4] = $iX_Client_Bar
			; Determine page size (aperture width / text width)
			$iH_FullPage = Floor($__g_aSB_WindowInfo[$iIndex][4] / $__g_aSB_WindowInfo[$iIndex][2])
			; Determine max size (scroll width / text width * correction factor for V scrollbar if required - tight)
			$__g_aSB_WindowInfo[$iIndex][6] = Floor($iH_Scroll / $__g_aSB_WindowInfo[$iIndex][2] * $__g_aSB_WindowInfo[$iIndex][4] / $iX_Client_Full) - $iH_Tight
		EndIf
	Else
		$__g_aSB_WindowInfo[$iIndex][6] = 0
	EndIf

	; If vertical scrollbar required
	Local $iV_FullPage
	If $iV_Scroll Then
		If $fBefore Then
			; Use actual aperture height
			$__g_aSB_WindowInfo[$iIndex][5] = $iY_Client_Bar
			; Determine page size (aperture width / text width)
			$iV_FullPage = Floor($__g_aSB_WindowInfo[$iIndex][5] / $__g_aSB_WindowInfo[$iIndex][3])
			; Determine max size (scroll width / text width - tight)
			$__g_aSB_WindowInfo[$iIndex][7] = Floor($iV_Scroll / $__g_aSB_WindowInfo[$iIndex][3]) - $iV_Tight
		Else
			; Use reduced aperture width only if other scrollbar exists
			If $iH_Scroll Then $__g_aSB_WindowInfo[$iIndex][5] = $iY_Client_Bar
			; Determine page size (aperture width / text width)
			$iV_FullPage = Floor($__g_aSB_WindowInfo[$iIndex][5] / $__g_aSB_WindowInfo[$iIndex][3])
			; Determine max size (scroll width / text width * correction factor for H scrollbar if required - tight)
			$__g_aSB_WindowInfo[$iIndex][7] = Floor($iV_Scroll / $__g_aSB_WindowInfo[$iIndex][3] * $__g_aSB_WindowInfo[$iIndex][5] / $iY_Client_Full) - $iV_Tight
		EndIf
	Else
		$__g_aSB_WindowInfo[$iIndex][7] = 0
	EndIf

	Local $aRet[4]
	If $iV_Scroll Then
		$aRet[0] = $iX_Client_Bar
	Else
		$aRet[0] = $iX_Client_Full
	EndIf
	If $iH_Scroll Then
		$aRet[1] = $iY_Client_Bar
	Else
		$aRet[1] = $iY_Client_Full
	EndIf
	$aRet[2] = $iX_Client_Bar / $iX_Client_Full
	$aRet[3] = $iY_Client_Bar / $iY_Client_Full

	; Save extended window info
	$__g_aSB_WindowInfoEx[$iIndex][0] = $iH_Scroll
	$__g_aSB_WindowInfoEx[$iIndex][1] = $iV_Scroll
	$__g_aSB_WindowInfoEx[$iIndex][2] = $aRet[2]
	$__g_aSB_WindowInfoEx[$iIndex][3] = $aRet[3]
	$__g_aSB_WindowInfoEx[$iIndex][4] = $fBefore
	$__g_aSB_WindowInfoEx[$iIndex][5] = $iRepeat
	$__g_aSB_WindowInfoEx[$iIndex][6] = (($iRepeat) ? ($iRepeat) : (7)) ; Set default 7 for mousewheel if no keys registered

	Local $fSuccess = True
	If _GUIScrollBars_ShowScrollBar($hWnd, $SB_BOTH, False) = False Then $fSuccess = False
	If $iH_Scroll Then
		If _GUIScrollBars_SetScrollInfoMax($hWnd, $SB_HORZ, $__g_aSB_WindowInfo[$iIndex][6]) = False Then $fSuccess = False
		_GUIScrollBars_SetScrollInfoPage($hWnd, $SB_HORZ, $iH_FullPage)
		If @error Then $fSuccess = False
		If _GUIScrollBars_ShowScrollBar($hWnd, $SB_HORZ, True) = False Then $fSuccess = False
	Else
		If _GUIScrollBars_ShowScrollBar($hWnd, $SB_HORZ, False) = False Then $fSuccess = False
	EndIf
	If $iV_Scroll Then
		If _GUIScrollBars_SetScrollInfoMax($hWnd, $SB_VERT, $__g_aSB_WindowInfo[$iIndex][7]) = False Then $fSuccess = False
		_GUIScrollBars_SetScrollInfoPage($hWnd, $SB_VERT, $iV_FullPage)
		If @error Then $fSuccess = False
		If _GUIScrollBars_ShowScrollBar($hWnd, $SB_VERT, True) = False Then $fSuccess = False
	Else
		If _GUIScrollBars_ShowScrollBar($hWnd, $SB_VERT, False) = False Then $fSuccess = False
	EndIf

	If $fSuccess Then Return $aRet
	Return SetError(3, 0, 0)

EndFunc   ;==>_GUIScrollbars_Generate

; #FUNCTION# =========================================================================================================
; Name...........: _GUIScrollbars_ReSizer
; Description ...: Registers required handlers and optionally creates GUI at max scrollable size
; Syntax.........: _GUIScrollbars_ReSizer ($hWnd, $iH_Max, $iV_Max, [, $bFullClient = False [, $bRegisterMsg = True]])
; Parameters ....: $hWnd         -> Resizable GUI
;                  $iH_Max       -> Max width where scrollbars needed
;                  $iV_Max       -> Max height where scrollbars needed
;                  $bFullClient  -> False (default) - GUI remains at created size and scrollbars shown if required
;                                   True - GUI resized to maximum client area where scrollbars not required
;                  $bRegisterMsg -> True (default) - Register WM_ENTER/EXITSIZEMOVE handlers
;                                   False - Do not register handlers
; Requirement(s).: v3.3.6.0 or higher
; Return values .: Success - An array holding width and height of GUI when scrollbars not needed
;                  Failure - Returns 0 with @error set as follows:
;                            1 - Invalid window handle
;                            2 - GUI not initiated
;                            3 - GUI not resizable
; Remarks .......; - Resizable GUIs have slightly smaller client areas than defined in GUICreate because of their
;                  thicker borders - setting $bFullClient to True resizes the GUI client area to the correct size
;                  - As this function resizes the GUI, it should be run BEFORE making the GUI visible
;                  - If there are existing message handlers for the WM_ENTER/EXITSIZEMOVE messages then
;                  $bMessageReg should be set to False and the relevant handler function(s) added to these handler(s)
;                  or registered separately
;                  - The returned array can be used in a WM_GETMINMAXINFO handler to prevent GUI being oversized
; Author ........: Melba23
; Example........; Yes
;=====================================================================================================================
Func _GUIScrollbars_ReSizer($hWnd, $iH_Max, $iV_Max, $bFullClient = False, $bRegisterMsg = True)

	; Check $hWnd
	If Not IsHWnd($hWnd) Then Return SetError(1, 0, 0)

	; Search for existing GUI
	For $iIndex = 1 To $__g_aSB_WindowInfo[0][0]
		If $hWnd = $__g_aSB_WindowInfo[$iIndex][0] Then
			ExitLoop
		EndIf
	Next
	If $iIndex > $__g_aSB_WindowInfo[0][0] Then Return SetError(2, 0, 0)

	; Check GUI resizable
	If Not BitAND(_WinAPI_GetWindowLong($hWnd, $GWL_STYLE), 0x00040000) Then Return SetError(3, 0, 0)

	; Set max scrollable sizes
	$__g_aSB_WindowInfoEx[$iIndex][7] = $iH_Max
	$__g_aSB_WindowInfoEx[$iIndex][8] = $iV_Max

	; Get current GUI size
	Local $aPos = WinGetPos($hWnd)
	; Resize GUI to max scrollable size
	_GUIScrollBars_ShowScrollBar($hWnd, $SB_BOTH, False)
	Local $aClientSize = WinGetClientSize($hWnd)
	; Resize GUI to set correct client area for max size
	Local $aMaxSize[2] = [$aPos[2] + $__g_aSB_WindowInfoEx[$iIndex][7] - $aClientSize[0], $aPos[3] + $__g_aSB_WindowInfoEx[$iIndex][8] - $aClientSize[1]]
	WinMove($hWnd, "", Default, Default, $aMaxSize[0], $aMaxSize[1])

	; Is GUI to be resized to original size
	If Not $bFullClient Then
		; Set scroll values
		$__g_aSB_WindowInfo[0][1] = 0
		$__g_aSB_WindowInfo[0][2] = 0
		; Resize GUI
		WinMove($hWnd, "", Default, Default, $aPos[2], $aPos[3])
		; Adjust Scrollbars
		$__g_aSB_WindowInfo[0][3] = $hWnd
		$__g_aSB_WindowInfo[0][4] = $iIndex
		__Scrollbars_WM_EXITSIZEMOVE($hWnd, 0, 0, 0)
	EndIf

	; Register mesaage handlers if required
	If $bRegisterMsg Then
		GUIRegisterMsg($WM_EXITSIZEMOVE, "__Scrollbars_WM_EXITSIZEMOVE")
		GUIRegisterMsg($WM_ENTERSIZEMOVE, "__Scrollbars_WM_ENTERSIZEMOVE")
	EndIf

	; Return max GUI size
	Return $aMaxSize

EndFunc   ;==>_GUIScrollbars_ReSizer

; #FUNCTION# =========================================================================================================
; Name...........: _GUIScrollbars_Locate_Ctrl
; Description ...: Calculates coordinates to use to position controls after scrollbar creation
; Syntax.........: _GUIScrollbars_Locate_Ctrl ($hWnd, $iX, $iY)
; Parameters ....: $hWnd -> GUI to contain control
;                  $iX   -> Horizontal coordinate relative to scrollable area
;                  $iY   -> Vertical coordinate relative to scrollable area
; Requirement(s).: v3.3.6.0 or higher
; Return values .: Success - Returns a 2-element array:
;                            [0] = Horizontal coordinate
;                            [1] = Vertical coordinate
;                  Failure - Returns either 0 with @error set as follows:
;                            1 - Invalid window handle
;                            2 - Parameter error
;                            3 - Window not found
; Remarks .......;
; Author ........: Melba23
; Example........; Yes
;=====================================================================================================================
Func _GUIScrollbars_Locate_Ctrl($hWnd, $iX, $iY)

	; Check $hWnd
	If Not IsHWnd($hWnd) Then Return SetError(1, 0, 0)

	; Find window info
	Local $iIndex = -1
	For $i = 0 To UBound($__g_aSB_WindowInfo) - 1
		If $hWnd = $__g_aSB_WindowInfo[$i][0] Then $iIndex = $i
	Next
	If $iIndex = -1 Then Return SetError(3, 0, 0)

	; Check if location is within scrollable area of the window
	If $iX < 0 Or $iY < 0 Then Return SetError(2, 0, 0)
	; Confirm there is a scrollbar in use first
	If $__g_aSB_WindowInfoEx[$iIndex][0] > 0 And $iX > $__g_aSB_WindowInfoEx[$iIndex][0] Then Return SetError(2, 0, 0)
	If $__g_aSB_WindowInfoEx[$iIndex][1] > 0 And $iY > $__g_aSB_WindowInfoEx[$iIndex][1] Then Return SetError(2, 0, 0)

	; Calculate factored coordinates if needed
	If Not $__g_aSB_WindowInfoEx[$iIndex][4] Then
		$iX *= $__g_aSB_WindowInfoEx[$iIndex][2]
		$iY *= $__g_aSB_WindowInfoEx[$iIndex][3]
	EndIf

	; Correct for any scrollbar movement
	$iX -= _GUIScrollBars_GetScrollInfoPos($hWnd, $SB_HORZ) * $__g_aSB_WindowInfo[$iIndex][2]
	$iY -= _GUIScrollBars_GetScrollInfoPos($hWnd, $SB_VERT) * $__g_aSB_WindowInfo[$iIndex][3]

	Local $aRet[2] = [$iX, $iY]

	Return $aRet

EndFunc   ;==>_GUIScrollbars_Locate_Ctrl

; #FUNCTION# =========================================================================================================
; Name...........: _GUIScrollbars_Scroll_Page
; Description ...: Scrolls scrollbars generated by _GUIScrollbars_Generate to min, max or page number
; Syntax.........: _GUIScrollbars_Scroll_Page ($hWnd, [$iH_Scroll_Pos = -1, [$iV_Scroll_Pos = -1]])
; Parameters ....: $hWnd          -> GUI to contain scrollbars
;                  $iH_Scroll_Pos -> Horizontal page number:
;                                    0 = No change
;                                    1+ = Scroll to page number
;                                    If page number is over max pages, then scroll to max position
;                  $iV_Scroll_Pos -> As $iH_Scroll_Pos for vertical pages
; Requirement(s).: v3.3.6.0 or higher
; Return values .: Success: @error = 0
;                  Failure: @error set as follows:
;                           1 - hWnd not a valid handle
;                           2 - Scrollbars not generated in that GUI
;                           3 - Invalid position parameters
; Remarks .......;
; Author ........: Melba23
; Example........; Yes
;=====================================================================================================================
Func _GUIScrollbars_Scroll_Page($hWnd, $iH_Scroll_Pos = 0, $iV_Scroll_Pos = 0)

	Local $iPos

	; Check $hWnd
	If Not IsHWnd($hWnd) Then Return SetError(1, 0, 0)

	; Check $iH/V_Scroll_Pos
	If Not (IsInt($iH_Scroll_Pos) And IsInt($iV_Scroll_Pos)) Then Return SetError(3, 0, 0)

	; Find window info
	Local $iIndex = -1
	For $i = 0 To UBound($__g_aSB_WindowInfo) - 1
		If $hWnd = $__g_aSB_WindowInfo[$i][0] Then $iIndex = $i
	Next
	If $iIndex = -1 Then Return SetError(2, 0, 0)

	; Get page sizes
	Local $iH_Page = Floor($__g_aSB_WindowInfo[$iIndex][4] / $__g_aSB_WindowInfo[$iIndex][2])
	Local $iV_Page = Floor($__g_aSB_WindowInfo[$iIndex][5] / $__g_aSB_WindowInfo[$iIndex][3])

	If $iH_Scroll_Pos > 0 Then
		$iPos = ($iH_Scroll_Pos - 1) * $iH_Page
		If $iPos > $__g_aSB_WindowInfo[$iIndex][6] Then $iPos = $__g_aSB_WindowInfo[$iIndex][6]
		_GUIScrollBars_SetScrollInfoPos($hWnd, $SB_HORZ, $iPos)
	EndIf
	If $iV_Scroll_Pos > 0 Then
		$iPos = ($iV_Scroll_Pos - 1) * $iV_Page
		If $iPos > $__g_aSB_WindowInfo[$iIndex][7] Then $iPos = $__g_aSB_WindowInfo[$iIndex][7]
		_GUIScrollBars_SetScrollInfoPos($hWnd, $SB_VERT, $iPos)
	EndIf

EndFunc   ;==>_GUIScrollbars_Scroll_Page

; #FUNCTION# =========================================================================================================
; Name...........: _GUIScrollbars_EventMonitor
; Description ...: Save and restores scrollbar positions on GUI minimize/restore
; Syntax.........: _GUIScrollbars_EventMonitor()
; Parameters ....:
; Requirement(s).: v3.3.6.0 or higher
; Return values .: Success: Returns 1
;                  Failure: Returns 0 with error:
;                           1 = Scrollbars not initialised for GUI (should never happen!)
; Remarks .......;
; Author ........: Melba23, based on code from rover and czardas
; Example........; Yes
;=====================================================================================================================
Func _GUIScrollbars_EventMonitor()

	; Check non-minimized event flag
	If $__g_aSB_WindowInfo[0][7] <> 0 Then
		; Get GUI handle
		Local $hWnd = $__g_aSB_WindowInfo[0][7]
		; Find window info
		Local $iIndex = -1
		For $i = 0 To UBound($__g_aSB_WindowInfo) - 1
			If $hWnd = $__g_aSB_WindowInfo[$i][0] Then $iIndex = $i
		Next
		If $iIndex = -1 Then Return SetError(1, 0, 0)

		; Retrieve scrollbar visibility data
		Local $aVis = $__g_aSB_WindowInfo[$iIndex][1]

		; Rehide unwanted scrollbars
		If $aVis[0] = False Then
			_GUIScrollBars_ShowScrollBar($hWnd, $SB_HORZ, False)
		EndIf
		If $aVis[1] = False Then
			_GUIScrollBars_ShowScrollBar($hWnd, $SB_VERT, False)
		EndIf
		; Set saved scrollbar position on minimize
		If $aVis[0] = True Then
			_GUIScrollBars_SetScrollInfoPos($hWnd, $SB_HORZ, $__g_aSB_WindowInfo[$iIndex][9])
		EndIf
		If $aVis[1] = True Then
			_GUIScrollBars_SetScrollInfoPos($hWnd, $SB_VERT, $__g_aSB_WindowInfo[$iIndex][8])
		EndIf
		; Clear event flag
		$__g_aSB_WindowInfo[0][7] = 0

		Return 1

	EndIf

	Return 0

EndFunc

; #INTERNAL_USE_ONLY#============================================================================================================
; Name...........: __Scrollbars_WM_VSCROLL
; Description ...: Handler for vertical scrollbar
; Syntax ........: __Scrollbars_WM_VSCROLL($hWnd, $iMsg, $wParam, $lParam)
; Return values .: None
; Author ........: Taken from AutoIt Help file
; Remarks .......:
; ===============================================================================================================================
Func __Scrollbars_WM_VSCROLL($hWnd, $iMsg, $wParam, $lParam)

	#forceref $iMsg, $wParam, $lParam
	Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
	Local $iIndex = -1, $yChar, $yPos
	Local $Min, $Max, $Page, $Pos, $TrackPos

	For $x = 0 To UBound($__g_aSB_WindowInfo) - 1
		If $__g_aSB_WindowInfo[$x][0] = $hWnd Then
			$iIndex = $x
			$yChar = $__g_aSB_WindowInfo[$iIndex][3]
			ExitLoop
		EndIf
	Next
	If $iIndex = -1 Then Return 0

	Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
	$Min = DllStructGetData($tSCROLLINFO, "nMin")
	$Max = DllStructGetData($tSCROLLINFO, "nMax")
	$Page = DllStructGetData($tSCROLLINFO, "nPage")
	$yPos = DllStructGetData($tSCROLLINFO, "nPos")
	$Pos = $yPos
	$TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")

	Switch $nScrollCode
		Case $SB_TOP
			DllStructSetData($tSCROLLINFO, "nPos", $Min)
		Case $SB_BOTTOM
			DllStructSetData($tSCROLLINFO, "nPos", $Max)
		Case $SB_LINEUP
			DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)
		Case $SB_LINEDOWN
			DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)
		Case $SB_PAGEUP
			DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)
		Case $SB_PAGEDOWN
			DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)
		Case $SB_THUMBTRACK
			DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
	EndSwitch

	DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
	_GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
	_GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)

	$Pos = DllStructGetData($tSCROLLINFO, "nPos")
	If ($Pos <> $yPos) Then
		_GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))
		$yPos = $Pos
	EndIf

	Return $GUI_RUNDEFMSG

EndFunc   ;==>__Scrollbars_WM_VSCROLL

; #INTERNAL_USE_ONLY#============================================================================================================
; Name...........: __Scrollbars_WM_HSCROLL
; Description ...: Handler for horizontal scrollbar
; Syntax ........: __Scrollbars_WM_HSCROLL($hWnd, $Msg, $wParam, $lParam)
; Return values .: None
; Author ........: Taken from AutoIt Help file
; Remarks .......:
; ===============================================================================================================================
Func __Scrollbars_WM_HSCROLL($hWnd, $iMsg, $wParam, $lParam)

	#forceref $iMsg, $lParam
	Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
	Local $iIndex = -1, $xChar, $xPos
	Local $Page, $Pos, $TrackPos

	For $x = 0 To UBound($__g_aSB_WindowInfo) - 1
		If $__g_aSB_WindowInfo[$x][0] = $hWnd Then
			$iIndex = $x
			$xChar = $__g_aSB_WindowInfo[$iIndex][2]
			ExitLoop
		EndIf
	Next
	If $iIndex = -1 Then Return 0

	Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_HORZ)
	$Page = DllStructGetData($tSCROLLINFO, "nPage")
	$xPos = DllStructGetData($tSCROLLINFO, "nPos")
	$Pos = $xPos
	$TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
	Switch $nScrollCode
		Case $SB_LINELEFT
			DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)
		Case $SB_LINERIGHT
			DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)
		Case $SB_PAGELEFT
			DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)
		Case $SB_PAGERIGHT
			DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)
		Case $SB_THUMBTRACK
			DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
	EndSwitch

	DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
	_GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
	_GUIScrollBars_GetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)

	$Pos = DllStructGetData($tSCROLLINFO, "nPos")
	If ($Pos <> $xPos) Then _GUIScrollBars_ScrollWindow($hWnd, $xChar * ($xPos - $Pos), 0)

	Return $GUI_RUNDEFMSG

EndFunc   ;==>__Scrollbars_WM_HSCROLL

; #INTERNAL_USE_ONLY#============================================================================================================
; Name...........: __Scrollbars_WM_MOUSEWHEEL
; Description ...: Handler for vertical mouse wheel scroll
; Syntax ........: __Scrollbars_WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam)
; Return values .: None
; Author ........: Based on code from MrCreator & Malkey
; Remarks .......: Pressing Ctrl or Shft will move the Horizontal scrollbar with the vertical mousewheel
; ===============================================================================================================================
Func __Scrollbars_WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam)

	#forceref $hWnd, $iMsg, $lParam
	Local $iDirn, $iDelta = BitShift($wParam, 16) ; Mouse wheel movement
	; Find window index
	Local $iIndex = -1
	For $i = 0 To UBound($__g_aSB_WindowInfo) - 1
		If $hWnd = $__g_aSB_WindowInfo[$i][0] Then $iIndex = $i
	Next
	If $iIndex <> -1 Then
		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 $__g_aSB_WindowInfoEx[$iIndex][6]
				_SendMessage($hWnd, $WM_HSCROLL, $iDirn)
			Next
		Else ; Move Vert scrollbar
			$iDirn = $SB_LINEDOWN
			If $iDelta > 0 Then $iDirn = $SB_LINEUP
			For $i = 1 To $__g_aSB_WindowInfoEx[$iIndex][6]
				_SendMessage($hWnd, $WM_VSCROLL, $iDirn)
			Next
		EndIf
	EndIf

	Return $GUI_RUNDEFMSG

EndFunc   ;==>__Scrollbars_WM_MOUSEWHEEL

; #INTERNAL_USE_ONLY#============================================================================================================
; Name...........: __Scrollbars_WM_MOUSEHWHEEL
; Description ...: Handler for horizontal mouse wheel scroll
; Syntax ........: __Scrollbars_WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam)
; Return values .: None
; Author ........: Based on code from MSDN, MrCreator & Malkey
; Remarks .......: This function is used internally by _Scrollbars_Generate
; ===============================================================================================================================
Func __Scrollbars_WM_MOUSEHWHEEL($hWnd, $iMsg, $wParam, $lParam)

	#forceref $hWnd, $iMsg, $lParam
	Local $iDirn = $SB_LINERIGHT
	If BitShift($wParam, 16) > 0 Then $iDirn = $SB_LINELEFT ; Mouse wheel movement
	; Find window index
	Local $iIndex = -1
	For $i = 0 To UBound($__g_aSB_WindowInfo) - 1
		If $hWnd = $__g_aSB_WindowInfo[$i][0] Then $iIndex = $i
	Next
	If $iIndex <> -1 Then
		For $i = 1 To $__g_aSB_WindowInfoEx[$iIndex][5]
			_SendMessage($hWnd, $WM_HSCROLL, $iDirn)
		Next
	EndIf

	Return $GUI_RUNDEFMSG

EndFunc   ;==>__Scrollbars_WM_MOUSEHWHEEL

; #INTERNAL_USE_ONLY#============================================================================================================
; Name...........: __Scrollbars_WM_KEYUP
; Description ...: Handler for scrolling with cursor, pageup/down, home, and end keys
; Syntax ........: __Scrollbars_WM_KEYUP($hWnd, $iMsg, $wParam, $lParam)
; Return values .: None
; Author ........: Based on code from Sm0ke_N
; Remarks .......: Pressing Ctrl with the Home and End keys will move the Horizontal scrollbar
; ===============================================================================================================================
Func __Scrollbars_WM_KEYUP($hWnd, $iMsg, $wParam, $lParam)

	#forceref $hWnd, $iMsg, $lParam

	Local $aRet_Ctrl
	; Find window index
	Local $iIndex = -1
	For $i = 0 To UBound($__g_aSB_WindowInfo) - 1
		If $hWnd = $__g_aSB_WindowInfo[$i][0] Then $iIndex = $i
	Next
	If $iIndex <> -1 Then
		; Check if Ctrl pressed
		Local $bCtrl = False
		$aRet_Ctrl = DllCall("user32.dll", "short", "GetAsyncKeyState", "int", "0x11")
		If $aRet_Ctrl[0] Then $bCtrl = True
		; Check key pressed
		Switch $wParam
			Case 0x21 ; PageUp
				If $bCtrl Then
					_SendMessage($hWnd, $WM_HSCROLL, $SB_PAGELEFT)
				Else
					_SendMessage($hWnd, $WM_VSCROLL, $SB_PAGEUP)
				EndIf
			Case 0x22 ; PageDown
				If $bCtrl Then
					_SendMessage($hWnd, $WM_HSCROLL, $SB_PAGERIGHT)
				Else
					_SendMessage($hWnd, $WM_VSCROLL, $SB_PAGEDOWN)
				EndIf
			Case 0x23 ; End
				If $bCtrl Then
					_GUIScrollBars_SetScrollInfoPos($hWnd, $SB_HORZ, $__g_aSB_WindowInfo[$iIndex][6])
				Else
					_GUIScrollBars_SetScrollInfoPos($hWnd, $SB_VERT, $__g_aSB_WindowInfo[$iIndex][7])
				EndIf
			Case 0x24 ; Home
				If $bCtrl Then
					_GUIScrollBars_SetScrollInfoPos($hWnd, $SB_HORZ, 0)
				Else
					_GUIScrollBars_SetScrollInfoPos($hWnd, $SB_VERT, 0)
				EndIf
			Case 0x25 ; Left
				For $i = 1 To $__g_aSB_WindowInfoEx[$iIndex][5]
					_SendMessage($hWnd, $WM_HSCROLL, $SB_LINELEFT)
				Next
			Case 0x26 ; Up
				For $i = 1 To $__g_aSB_WindowInfoEx[$iIndex][5]
					_SendMessage($hWnd, $WM_VSCROLL, $SB_LINEUP)
				Next
			Case 0x27 ; Right
				For $i = 1 To $__g_aSB_WindowInfoEx[$iIndex][5]
					_SendMessage($hWnd, $WM_HSCROLL, $SB_LINERIGHT)
				Next
			Case 0x28 ; Down
				For $i = 1 To $__g_aSB_WindowInfoEx[$iIndex][5]
					_SendMessage($hWnd, $WM_VSCROLL, $SB_LINEDOWN)
				Next
		EndSwitch
	EndIf
	Return $GUI_RUNDEFMSG
EndFunc   ;==>__Scrollbars_WM_KEYUP

; #INTERNAL_USE_ONLY#============================================================================================================
; Name...........: __Scrollbars_WM_ENTERSIZEMOVE
; Description ...: Handler for detecting when GUI resizing is started
; Syntax ........: __Scrollbars_WM_ENTERSIZEMOVE($hWnd, $iMsg, $wParam, $lParam)
; Return values .: None
; Author ........: Based on code from KaFu
; Remarks .......:
; ===============================================================================================================================
Func __Scrollbars_WM_ENTERSIZEMOVE($hWnd, $iMsg, $wParam, $lParam)

	#forceref $hWnd, $iMsg, $wParam, $lParam

	; Check GUI has generated scrollbars
	For $iIndex = 1 To $__g_aSB_WindowInfo[0][0]
		If $hWnd = $__g_aSB_WindowInfo[$iIndex][0] Then
			; Store current scrollbar positions
			$__g_aSB_WindowInfo[0][1] = _GUIScrollBars_GetScrollInfoPos($hWnd, $SB_HORZ)
			$__g_aSB_WindowInfo[0][2] = _GUIScrollBars_GetScrollInfoPos($hWnd, $SB_VERT)
			; Reset scrollbar positions to 0
			_GUIScrollBars_SetScrollInfoPos($hWnd, $SB_HORZ, 0)
			_GUIScrollBars_SetScrollInfoPos($hWnd, $SB_VERT, 0)
			; Hide scrollbars
			_GUIScrollBars_ShowScrollBar($hWnd, $SB_BOTH, False)
			; Store GUI handle and index
			$__g_aSB_WindowInfo[0][3] = $hWnd
			$__g_aSB_WindowInfo[0][4] = $iIndex
			ExitLoop
		EndIf
	Next

EndFunc   ;==>__Scrollbars_WM_ENTERSIZEMOVE

; #INTERNAL_USE_ONLY#============================================================================================================
; Name...........: __Scrollbars_WM_EXITSIZEMOVE
; Description ...: Handler for detecting when GUI resizing is complete
; Syntax ........: __Scrollbars_WM_EXITSIZEMOVE($hWnd, $iMsg, $wParam, $lParam)
; Return values .: None
; Author ........: Based on code from KaFu
; Remarks .......:
; ===============================================================================================================================
Func __Scrollbars_WM_EXITSIZEMOVE($hWnd, $iMsg, $wParam, $lParam)

	#forceref $hWnd, $iMsg, $wParam, $lParam

	; Check if handle matches
	If $hWnd = $__g_aSB_WindowInfo[0][3] And $__g_aSB_WindowInfo[0][4] <> -1 Then
		; Retrieve index
		Local $iIndex = $__g_aSB_WindowInfo[0][4]
		; Get final size
		Local $aClientSize = WinGetClientSize($hWnd)
		; Check if scrollbars needed
		Local $iH_Aperture = 0, $iV_Aperture = 0, $iH_Reduction = 0, $iV_Reduction = 0
		; Loop to check if client area reduced by scrollbars
		For $i = 1 To 2
			If $aClientSize[0] < $__g_aSB_WindowInfoEx[$iIndex][7] + $iH_Reduction Then
				$iH_Aperture = $__g_aSB_WindowInfoEx[$iIndex][7] + $iH_Reduction
				$iV_Reduction = $__g_aSB_WindowInfo[0][6] ; Height of HScrollbar
			EndIf
			If $aClientSize[1] < $__g_aSB_WindowInfoEx[$iIndex][8] + $iV_Reduction Then
				$iV_Aperture = $__g_aSB_WindowInfoEx[$iIndex][8] + $iV_Reduction
				$iH_Reduction = $__g_aSB_WindowInfo[0][5] ; Width of VScrollbar
			EndIf
		Next
		; Generate required scrollbars
		_GUIScrollbars_Generate($hWnd, $iH_Aperture, $iV_Aperture)
		; Reset scrollbar positions
		If $iH_Aperture Then _GUIScrollBars_SetScrollInfoPos($hWnd, $SB_HORZ, $__g_aSB_WindowInfo[0][1])
		If $iV_Aperture Then _GUIScrollBars_SetScrollInfoPos($hWnd, $SB_VERT, $__g_aSB_WindowInfo[0][2])
		; Clear GUI handle and index
		$__g_aSB_WindowInfo[0][1] = 0
		$__g_aSB_WindowInfo[0][4] = -1
	EndIf

EndFunc   ;==>__Scrollbars_WM_EXITSIZEMOVE

; #INTERNAL_USE_ONLY#============================================================================================================
; Name...........: __Scrollbars_WM_SIZE
; Description ...: Handler for detecting when GUI enters/exits minimized state
; Syntax ........: __Scrollbars_WM_SIZE($hWnd, $iMsg, $wParam, $lParam)
; Return values .: None
; Author ........: Melba23
; Remarks .......:
; ===============================================================================================================================
Func __Scrollbars_WM_SIZE($hWnd, $iMsg, $wParam, $lParam)

	#forceref $hWnd, $iMsg, $wParam, $lParam

	; Find window index
	Local $iIndex = -1
	For $i = 1 To UBound($__g_aSB_WindowInfo) - 1
		If $hWnd = $__g_aSB_WindowInfo[$i][0] Then $iIndex = $i
	Next
	If $iIndex <> -1 Then
		; Check state
		If $hWnd = $__g_aSB_WindowInfo[$iIndex][0] Then
			; If GUI has just been minimized
			If BitAND(WinGetState($hWnd), $WIN_STATE_MINIMIZED) And $__g_aSB_WindowInfoEx[$iIndex][9] = False Then
				; Show both scrollbars
				_GUIScrollBars_ShowScrollBar($hWnd, $SB_BOTH, True)
				; Get vertical current position and move to top
				$__g_aSB_WindowInfo[$iIndex][8] = _GUIScrollBars_GetScrollPos($hWnd, $SB_VERT)
				_GUIScrollBars_SetScrollInfoPos($hWnd, $SB_VERT, 0)
				; Get horizontal current position and move to left
				$__g_aSB_WindowInfo[$iIndex][9] = _GUIScrollBars_GetScrollPos($hWnd, $SB_HORZ)
				_GUIScrollBars_SetScrollInfoPos($hWnd, $SB_HORZ, 0)
				; Set minimized flag
				$__g_aSB_WindowInfoEx[$iIndex][9] = True
			; If GUI has just been restored or maximized from minimized state
			ElseIf Not(BitAND(WinGetState($hWnd), $WIN_STATE_MINIMIZED)) And $__g_aSB_WindowInfoEx[$iIndex][9] = True Then
				; Set non-minimized event flag
				$__g_aSB_WindowInfo[0][7] = $hWnd
				; Clear minimized flag
				$__g_aSB_WindowInfoEx[$iIndex][9] = False
			EndIf
		EndIf
	EndIf

EndFunc   ;==>__Scrollbars_WM_SIZE

posted on 2022-10-15 17:46  lazycookie  阅读(21)  评论(0编辑  收藏  举报