#Region - TimeStamp
; 2014-05-15 13:55:54   v 0.1
#EndRegion - TimeStamp

#cs ===========================================================  Funktionen  =====

	_TTMove_StartUp()
		Initialisiert die UDF

	_TTMove_ShutDown()      ( optional )
		Freigeben der Ressourcen - automatisch bei Programmende

	_TTMove_RegisterTip()
		Registrieren eines ToolTips für die UDF

	_TTMove_UnRegisterTip()
		ToolTip aus der Registrierung entfernen



====  Code-Bsp. ==================================================================

#include ToolTipMove.au3'

HotKeySet('^!{F9}', '_exit')                 ; Ctrl+Alt+F9 zum Beenden
HotKeySet('^!{F10}', '_change')              ; Ctrl+Alt+F10 -- schließt Tip#1 und zeigt Tip#2 an

Global $sToolTip1 = "Das ist ein Test-Tool-Tipp [1]"
Global $sToolTip2 = "Das ist ein Test-Tool-Tipp [2]"

_TTMove_StartUp()
_TTMove_RegisterTip($sToolTip1)
_TTMove_RegisterTip($sToolTip2)


ToolTip($sToolTip1)

While True
	Sleep(50)
WEnd

Func _change()
	ToolTip('')
	ToolTip($sToolTip2)
EndFunc

Func _exit()
	Exit
EndFunc

==================================================================================

#ce

#include-once
#include <WinAPI.au3>
#include <WindowsConstants.au3>

OnAutoItExitRegister('__TTMove_Exit')
Global Const $__HC_ACTION = 0

Global $__oTTTitle
Global $__hStub_MouseProc
Global $__hmod
Global $__hHook
Global $fLeftPressDown, $fMove

Func _TTMove_StartUp()
	$__oTTTitle = ObjCreate('Scripting.Dictionary')
	$__hStub_MouseProc = DllCallbackRegister("__TTMove_MouseProc", "long", "int;wparam;lparam")
	$__hmod = _WinAPI_GetModuleHandle(0)
	$__hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($__hStub_MouseProc), $__hmod)
	$fLeftPressDown = False
	$fMove = False
EndFunc

Func _TTMove_ShutDown()
	$__oTTTitle = 0
	$__hmod = 0
	__TTMove_Exit()
EndFunc

Func _TTMove_RegisterTip($_sTitle)
	If Not $__oTTTitle.Exists($_sTitle) Then
		$__oTTTitle.Add($_sTitle, 1)
		Return 1
	Else
		Return 0
	EndIf
EndFunc

Func _TTMove_UnRegisterTip($_sTitle)
	If $__oTTTitle.Exists($_sTitle) Then
		$__oTTTitle.Remove($_sTitle)
		Return 1
	Else
		Return 0
	EndIf
EndFunc


; == internal Functions

Func __TTMove_GetHwnd()
	For $tip In $__oTTTitle.Keys
		If WinExists($tip) Then
			Return WinGetHandle($tip)
		EndIf
	Next
	Return 0
EndFunc

Func __TTMove_MouseProc($nCode, $wParam, $lParam)
	Local $event, $info, $iX, $iY
	$info = DllStructCreate("int X;int Y;dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo", $lParam)
	$iX = DllStructGetData($info, 1)
    $iY = DllStructGetData($info, 2)
    $mouseData = DllStructGetData($info, 3)
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($__hHook, $nCode, $wParam, $lParam)
    If $nCode = $__HC_ACTION Then
		Switch $wParam
			Case $WM_MOUSEMOVE
				__TTMove_MoveWnd(__TTMove_GetHwnd(), $iX, $iY)
			Case $WM_LBUTTONDOWN
				If __TTMove_MoveWnd(__TTMove_GetHwnd(), $iX, $iY, True) = 1 Then $fLeftPressDown = True
			Case $WM_LBUTTONUP
				If __TTMove_MoveWnd(__TTMove_GetHwnd(), $iX, $iY) = 1 Then
					$fLeftPressDown = False
					$fMove = False
				EndIf
		EndSwitch
	EndIf
	Return _WinAPI_CallNextHookEx($__hHook, $nCode, $wParam, $lParam)
EndFunc

Func __TTMove_MoveWnd($_hToolTip, $_x, $_y, $_fSet=False)
	If $_hToolTip = 0 Then Return 0
	Local $aPos = WinGetPos($_hToolTip)
	Local Static $xLast, $yLast
	If $_fSet Then
		If $_x < $aPos[0] Or $aPos[0]+$aPos[2] < $_x Or $_y < $aPos[1] Or $aPos[1]+$aPos[3] < $_y Then Return 0
		$xLast = $_x
		$yLast = $_y
		$fMove = True
		Return 1
	EndIf
	If Not $fMove Then Return 0
	Local $xDiff = ($_x) - ($xLast)
	Local $yDiff = ($_y) - ($yLast)
	$xLast = $_x
	$yLast = $_y
	WinMove($_hToolTip, '', $aPos[0]+($xDiff), $aPos[1]+($yDiff))
	Return 1
EndFunc

Func __TTMove_Exit()
    _WinAPI_UnhookWindowsHookEx($__hHook)
    DllCallbackFree($__hStub_MouseProc)
EndFunc   ;==>OnAutoItExit