ToolTipMove - UDF

    • Offizieller Beitrag

    Ob man sowas tatsächlich braucht - darüber läßt sich sicher streiten :D
    Im Forum gab es diese Fragestellung und ich habe das nun in eine UDF gepackt: ToolTip per Maus verschieben.


    Edit 16.05.2014: Bsp. erweitert

    ToolTipMove.au3 (v.01)
    [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

    _TTMove_StartUp()
    Initialisiert die UDF

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

    _TTMove_RegisterTip()
    Registrieren eines ToolTips für die UDF

    [/autoit] [autoit][/autoit] [autoit]

    _TTMove_UnRegisterTip()
    ToolTip aus der Registrierung entfernen

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

    #ce

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; == internal Functions

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit]
    Beispiel
    [autoit]

    #include 'ToolTipMove.au3'

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet('^!{F9}', '_exit') ; Ctrl+Alt+F9 zum Beenden
    HotKeySet('^!{F10}', '_switchTip') ; Ctrl+Alt+F10 -- wechselt zwischen Tip#1 und Tip#2
    HotKeySet('^!{F11}', '_unregister') ; Ctrl+Alt+F11 -- UnRegister Tip#1 - nur noch Tip#2 verschiebbar

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ToolTip($sToolTip1)

    [/autoit] [autoit][/autoit] [autoit]

    While True
    Sleep(50)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _switchTip()
    Local Static $aTip[2] = [$sToolTip1,$sToolTip2]
    Local Static $iCurr = 0
    ToolTip('')
    $iCurr = BitXOR($iCurr,1)
    ToolTip($aTip[$iCurr])
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _unregister()
    _TTMove_UnRegisterTip($sToolTip1)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    Exit
    EndFunc

    [/autoit]