#include <WinAPI.au3>

; -Author: name22 (www.autoit.de)

Run(@AutoItExe & ' "' & @ScriptDir & '\Bildschirmlupe.au3"')

Global Const $tagMSLLHOOKSTRUCT = "INT X; INT Y;DWORD mouseData;DWORD flags;DWORD time;ULONG_PTR dwExtraInfo", $WM_EVENT = _WinAPI_RegisterWindowMessage("AutoItEvent")
Global $hWnd_Magnifier, $hMouseHook, $hMouseProc, $hSendAsyncProc, $pSendAsyncProc, $bEventReady = True
Global $hDll_User32 = DllOpen("user32.dll")

Do
	$hWnd_Magnifier = WinGetHandle("AutoItMagnifyingGUI")
Until Not @error

$hMouseProc = DllCallbackRegister("_MouseProc", "INT", "INT;PTR;PTR")
$hMouseHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hMouseProc), _WinAPI_GetModuleHandle(0), 0)
$hSendAsyncProc = DllCallbackRegister("_SendAsyncProc", "NONE", "HWND;UINT;ULONG_PTR;LRESULT")
$pSendAsyncProc = DllCallbackGetPtr($hSendAsyncProc)

Sleep(10)
DllCall($hDll_User32, "BOOL", "SendMessageCallback", "HWND", $hWnd_Magnifier, "UINT", $WM_EVENT, "WPARAM", _WinAPI_GetMousePosX(), "LPARAM", _WinAPI_GetMousePosY(), "PTR", $pSendAsyncProc, "ULONG_PTR", 0)

While Sleep(500)
	If Not WinExists($hWnd_Magnifier) Then Exit
WEnd

Func _MouseProc($nCode, $wParam, $lParam)
	Local $aRet = DllCall($hDll_User32, "LRESULT", "CallNextHookEx", "HANDLE", $hMouseHook, "INT", $nCode, "WPARAM", $wParam, "LPARAM", $lParam)
	If $nCode < 0 Then Return $aRet[0]
	If BitAND($wParam, 0xFFFF) = 0x0200 And $bEventReady Then
		Local $tMHook = DllStructCreate($tagMSLLHOOKSTRUCT, $lParam)
		$bEventReady = False
		DllCall($hDll_User32, "BOOL", "SendMessageCallback", "HWND", $hWnd_Magnifier, "UINT", $WM_EVENT, "WPARAM", DllStructGetData($tMHook, "X"), "LPARAM", DllStructGetData($tMHook, "Y"), "PTR", $pSendAsyncProc, "ULONG_PTR", 0)
	EndIf
	Return $aRet[0]
EndFunc

Func _SendAsyncProc($hWnd, $iMsg, $dwData, $lResult)
	$bEventReady = True
EndFunc

Func _Shutdown()
	_WinAPI_UnhookWindowsHookEx($hMouseHook)
	DllCallbackFree($hMouseProc)
	DllCallbackFree($hSendAsyncProc)
	DllClose($hDll_User32)
EndFunc