﻿#include <WinAPISysInternals.au3>
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>

OnAutoItExitRegister('_Exit')

Global $hGui = GUICreate('Test', 640, 480)
GUISetState()

#Region stellt die 1.UDF dar
Global $hProcNew1 = DllCallbackRegister('_WindowProc1', 'ptr', 'hwnd;uint;wparam;lparam')
Global $hProcOld1 = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, DllCallbackGetPtr($hProcNew1))
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : DllCallbackGetPtr($hProcNew1) = ' & DllCallbackGetPtr($hProcNew1) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hProcOld1 (Orig WinProc) = 0x' & Hex($hProcOld1) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
#EndRegion

#Region stellt die 2.UDF dar
Global $hProcNew2 = DllCallbackRegister('_WindowProc2', 'ptr', 'hwnd;uint;wparam;lparam')
Global $hProcOld2 = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, DllCallbackGetPtr($hProcNew2))
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : DllCallbackGetPtr($hProcNew2) = ' & DllCallbackGetPtr($hProcNew2) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hProcOld2 = 0x' & Hex($hProcOld2) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
#EndRegion

Do
Until GUIGetMsg() = -3
Exit

Func _Exit()
	Local $ret
	$ret = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, $hProcOld2)
	ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : ret $hProcOld2 = 0x' & Hex($ret) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
	DllCallbackFree($hProcNew2)

	$ret = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, $hProcOld1)
	ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : ret $hProcOld1 = 0x' & Hex($ret) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
	DllCallbackFree($hProcNew1)

	$ret = _WinAPI_GetWindowLong($hGui, $GWL_WNDPROC) ; zum testen, ob der Originalwert wieder bei der Gui eingetragen ist
	ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : Orig WinProc = 0x' & Hex($ret) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
EndFunc   ;==>_Exit


Func _WindowProc1($hWnd, $iMsg, $wParam, $lParam)
	Switch $iMsg
		Case $WM_MOUSEWHEEL
			ConsoleWrite('_WindowProc1 $WM_MOUSEWHEEL' & @CR)
	EndSwitch
	Return _WinAPI_CallWindowProc($hProcOld1, $hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>_WindowProc1

Func _WindowProc2($hWnd, $iMsg, $wParam, $lParam)
	Switch $iMsg
		Case $WM_WINDOWPOSCHANGED
			ConsoleWrite('_WindowProc2 $WM_WINDOWPOSCHANGED' & @CR)
	EndSwitch
	Return _WinAPI_CallWindowProc($hProcOld2, $hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>_WindowProc2
