Jump to content

Slow response to hover messages?

Recommended Posts


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

; #VARIABLES# ===================================================================================================================
; ===============================================================================================================================
Global $mCtrl_Hover[]
$mCtrl_Hover['Old'] = ''
$mCtrl_Hover['LastDown'] = False ;When mouse is down, record the ctrl to check the up ctrl is the previous one

; #FUNCTION# ====================================================================================================================
; Name...........: _GUICtrlOnHover_Register
; Description ...: Registers a function to be called when GUI elements been hovered.
; Syntax.........: _GUICtrlOnHover_Register($idCtrl [, $sHover_Func= -1 [, $sLeave_Func=-1 [, $sPrimaryDown_Func=-1 [, $sPrimaryUp_Func=-1]]]])
Func _GUICtrlOnHover_Register($idCtrl, $sHover_Func = -1, $sLeave_Func = -1, $sPrimaryDown_Func = -1, $sPrimaryUp_Func = -1)
    If $idCtrl = -1 Then $idCtrl = _WinAPI_GetDlgCtrlID(GUICtrlGetHandle(-1))
    If $sHover_Func <> -1 Then _NewMap($mCtrl_Hover, $idCtrl, 'Hover', $sHover_Func)
    If $sLeave_Func <> -1 Then _NewMap($mCtrl_Hover, $idCtrl, 'Leave', $sLeave_Func)
    If $sPrimaryDown_Func <> -1 Then _NewMap($mCtrl_Hover, $idCtrl, 'PrimaryDown', $sPrimaryDown_Func)
    If $sPrimaryUp_Func <> -1 Then _NewMap($mCtrl_Hover, $idCtrl, 'PrimaryUp', $sPrimaryUp_Func)
    _NewMap($mCtrl_Hover, $idCtrl, 'IsHover', False) ;When mouse is hovering the ctrl, do not call Hover Func when the mouse moving on it.
    If Not MapExists($mCtrl_Hover[$idCtrl], 'IsRegistered') Then
        Local $hProcNew = DllCallbackRegister("_GUICtrlOnHover__CallBack", "int", "hwnd;uint;uint;dword")
        $mCtrl_Hover['Old'] = _WinAPI_SetWindowLong(GUICtrlGetHandle($idCtrl), $GWL_WNDPROC, DllCallbackGetPtr($hProcNew))
        _NewMap($mCtrl_Hover, $idCtrl, 'IsRegistered', True, False)
EndFunc   ;==>_GUICtrlOnHover_Register

Func _GUICtrlOnHover__CallBack($hWnd, $uiMsg, $wParam, $lParam)
    Local $iCtrl = _WinAPI_GetDlgCtrlID($hWnd)
    Switch $uiMsg
        Case $WM_LBUTTONDOWN ;PrimaryDown
            $mCtrl_Hover['LastDown'] = $iCtrl
            If MapExists($mCtrl_Hover[$iCtrl], 'PrimaryDown') Then
                Call($mCtrl_Hover[$iCtrl]['PrimaryDown'], $iCtrl)
        Case $WM_LBUTTONUP ;PrimaryUp
            If MapExists($mCtrl_Hover[$iCtrl], 'PrimaryUp') And $iCtrl = $mCtrl_Hover['LastDown'] Then
                Call($mCtrl_Hover[$iCtrl]['PrimaryUp'], $iCtrl)
            $mCtrl_Hover['LastDown'] = False
        Case $WM_MOUSEHOVER ;Hover
            If MapExists($mCtrl_Hover[$iCtrl], 'Hover') And Not $mCtrl_Hover[$iCtrl]['IsHover'] Then
                $mCtrl_Hover[$iCtrl]['IsHover'] = True
                Call($mCtrl_Hover[$iCtrl]['Hover'], $iCtrl)
        Case $WM_MOUSELEAVE ;Leave
            If MapExists($mCtrl_Hover[$iCtrl], 'Leave') Then
                $mCtrl_Hover[$iCtrl]['IsHover'] = False
                Call($mCtrl_Hover[$iCtrl]['Leave'], $iCtrl)
        Case $WM_MOUSEMOVE ;Move
            If Not $mCtrl_Hover[$iCtrl]['IsHover'] Then _GUICtrlOnHover__TrackMouseEvent($hWnd, BitOR($TME_HOVER, $TME_LEAVE), 1) ;Triggers a hover/leave message
    Return _WinAPI_CallWindowProc($mCtrl_Hover['Old'], $hWnd, $uiMsg, $wParam, $lParam)
EndFunc   ;==>_GUICtrlOnHover__CallBack

Func _GUICtrlOnHover__TrackMouseEvent($hWnd, $iFlags, $iTime)
    Local $tTME = DllStructCreate('dword;dword;hwnd;dword')
    DllStructSetData($tTME, 1, DllStructGetSize($tTME))
    DllStructSetData($tTME, 2, $iFlags)
    DllStructSetData($tTME, 3, $hWnd)
    DllStructSetData($tTME, 4, $iTime)
    Local $aRet = DllCall('user32.dll', 'bool', 'TrackMouseEvent', 'struct*', $tTME)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aRet[0]
EndFunc   ;==>_GUICtrlOnHover__TrackMouseEvent

Only can be run in AutoIt Beta :)

I use _WinAPI_SetWindowLong to response to hover messages, but it is too slow. Is there anyone can give some advice?

Link to comment
Share on other sites

  • Developers


Could you please stop:

  • Quoting the previous post (Counts for the both of you!). Only quote pieces when it makes sense!
  • Posting in none English! It is fine you use Google  translate, but we do not need this translation in this thread!


SciTE4AutoIt3 Full installer Download page   - Beta files       Read before posting     How to post scriptsource   Forum etiquette  Forum Rules 
Live for the present,
Dream of the future,
Learn from the past.

Link to comment
Share on other sites

  • 2 years later...

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...