Func IsMouseOver()

  • Moin,

    weil es immer wieder gern nachgefragt wird, kommt hier die 25. Ausgabe einer Mouse(H)over Funktion:

    Ein Beispielskript:
    [autoit]

    #include <GUIConstantsEx.au3>

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

    Opt('MustDeclareVars', 1)

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

    Global $MOW_State = ""
    Global $New_State = ""
    Global $hWindow = ""

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

    Global $GUI = GUICreate("Mouse over Window", 400, 400)
    Global $M = GUICtrlCreateLabel("", 20, 20, 50, 20)
    Global $W = GUICtrlCreateLabel("Over GUI", 90, 20, 290, 20)
    Global $E = GUICtrlCreateEdit("", 20, 40, 360, 320)
    Global $hEDIT = GUICtrlGetHandle(-1)
    Global $BTN1 = GUICtrlCreateButton("Over GUI", 20, 360, 100)
    Global $hBTN1 = GUICtrlGetHandle(-1)
    Global $BTN2 = GUICtrlCreateButton("Over Edit", 150, 360, 100)
    Global $hBTN2 = GUICtrlGetHandle(-1)
    Global $BTN3 = GUICtrlCreateButton("Over Me", 280, 360, 100)
    Global $hBTN3 = GUICtrlGetHandle(-1)
    $hWindow = $GUI
    GUISetState()
    ; ======================================================================================================================
    While "True"
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $BTN1
    $hWindow = $GUI
    $MOW_State = ""
    GUICtrlSetData($W, "Over GUI")
    Case $BTN2
    $hWindow = $hEDIT
    $MOW_State = ""
    GUICtrlSetData($W, "Over Edit")
    Case $BTN3
    $hWindow = $hBTN3
    $MOW_State = ""
    GUICtrlSetData($W, "Over Button")
    EndSwitch
    $New_State = IsMouseOver($hWindow)
    If String($New_State) <> String($MOW_State) Then
    GUICtrlSetData($M, $New_State)
    If $New_State Then
    GUICtrlSetColor($M, 0x008000)
    Else
    GUICtrlSetColor($M, 0xFF0000)
    EndIf
    $MOW_State = $New_State
    EndIf
    WEnd
    Exit
    ; ======================================================================================================================
    Func IsMouseOver($HWND)
    ; $HWND = HWND eines Fensters oder eines Controls
    Local $POINT = DllStructCreate("LONG X;LONG Y")
    Local $pPOINT = DllStructGetPtr($POINT)
    Local $aResult, $X, $Y
    $aResult = DllCall("User32.dll", "BOOL", "GetCursorPos", "Ptr", $pPOINT)
    If @error Or Not $aResult[0] Then Return SetError(1, 0, False)
    $X = DllStructGetData($POINT, "X")
    $Y = DllStructGetData($POINT, "Y")
    $aResult = DllCall("User32.dll", "HWND", "WindowFromPoint", "LONG", $X, "LONG", $Y)
    If @error Then Return SetError(2, 0, False)
    If Not $aResult[0] Then Return False
    If $aResult[0] = $HWND Then Return True
    $aResult = DllCall("User32.dll", "HWND", "GetAncestor", "HWND", $aResult[0], "UINT", 2) ; GA_ROOT = 2
    If @error Then Return SetError(3, 0, False)
    If $aResult[0] = $HWND Then Return True
    Return False
    EndFunc

    [/autoit]
    Die Funktion:
    [autoit]

    Func IsMouseOver($HWND)
    ; $HWND = HWND eines Fensters oder eines Controls
    Local $POINT = DllStructCreate("LONG X;LONG Y")
    Local $pPOINT = DllStructGetPtr($POINT)
    Local $aResult, $X, $Y
    $aResult = DllCall("User32.dll", "BOOL", "GetCursorPos", "Ptr", $pPOINT)
    If @error Or Not $aResult[0] Then Return SetError(1, 0, False)
    $X = DllStructGetData($POINT, "X")
    $Y = DllStructGetData($POINT, "Y")
    $aResult = DllCall("User32.dll", "HWND", "WindowFromPoint", "LONG", $X, "LONG", $Y)
    If @error Then Return SetError(2, 0, False)
    If Not $aResult[0] Then Return False
    If $aResult[0] = $HWND Then Return True
    $aResult = DllCall("User32.dll", "HWND", "GetAncestor", "HWND", $aResult[0], "UINT", 2) ; GA_ROOT = 2
    If @error Then Return SetError(3, 0, False)
    If $aResult[0] = $HWND Then Return True
    Return False
    EndFunc

    [/autoit]