Jump to content

Recommended Posts

Posted (edited)

specifically, I am using the code:

tooltip ("sometext"..... )

I would like the script to detect if user clicks on this tooltip (as if it is a clickable button) and performs a task if so. Is this possible?

The reason I want to use Tooltip over other methods such as GUICtrlCreateLabel is because I am using tooltip to display a timer constantly and using GUICtrlCreateLabel would unfocus on what the user is doing causing it to lose sound and such. Tooltip does not do that.

ADD:
I search some threads and found ideas using Mouseclick events and then checking where mouse was clicking at. Is this a good idea?

thanks.

Edited by Burgaud
  • 2 weeks later...
Posted (edited)

You can do it so:

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

HotKeySet('^+q', '_Exit')  ; Ctrl+Shift+Q
OnAutoItExitRegister('OnAutoItExit')

Global Const $HC_ACTION = 0
Global $hStub_MouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam")
Global $hmod = _WinAPI_GetModuleHandle(0)
Global $hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), $hmod)

ToolTip(StringFormat("%02d:%02d:%02d", @HOUR, @MIN, @SEC) , 100, 100, 'TOOLTIP - TIME', 1, 1)
Global $tTip = _GetRectTip()
Global $bClick = False
AdlibRegister("_ToolTipRefresh", 1000)


While True
    If $bClick Then
        $bClick = False
        ConsoleWrite('Tip was clicked' & @CRLF)
    EndIf
    Sleep(100)
WEnd


Func _Exit()
    Exit
EndFunc


Func OnAutoItExit()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hStub_MouseProc)
EndFunc


Func _ToolTipRefresh()
    ToolTip(StringFormat("%02d:%02d:%02d", @HOUR, @MIN, @SEC) , 100, 100, 'TOOLTIP - TIME', 1, 1)
EndFunc


Func _GetRectTip()
    Local $hTip = WinGetHandle('[CLASS:tooltips_class32]')
    Local $aPos = WinGetPos($hTip)
    Local $tRECT = DllStructCreate("int Left;int Top;int Right;int Bottom")
    DllCall("user32", 'long', 'SetRect', 'ptr', DllStructGetPtr($tRECT), 'long', $aPos[0], 'long', $aPos[1], 'long', $aPos[0]+$aPos[2], 'long', $aPos[1]+$aPos[3])
    Return $tRECT
EndFunc


Func _MouseProc($nCode, $wParam, $lParam)
    Local $info = DllStructCreate("int X;int Y;dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo", $lParam)
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    If $nCode = $HC_ACTION Then
        Switch $wParam
            Case $WM_LBUTTONDOWN
                If _WinAPI_CoordInRect($tTIP, $info.X, $info.Y) Then $bClick = True
        EndSwitch
    EndIf
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc


Func _WinAPI_CoordInRect(ByRef $tRECT, $X, $Y)
    If Not IsDllStruct($tRECT) Then Return SetError(1,0,0)
    Local $ret = DllCall("user32", "long", "PtInRect", "ptr", DllStructGetPtr($tRECT), "long", $X,  "long", $Y)
    If @error > 0 Then Return SetError(2,@error,0)
    If $ret[0] Then
        Return True
    Else
        Return False
    EndIf
EndFunc

 

Edited by BugFix

Best Regards BugFix  

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...