Moin,
weil es immer wieder gern nachgefragt wird, kommt hier die 25. Ausgabe einer Mouse(H)over Funktion:
Ein Beispielskript:
#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]Opt('MustDeclareVars', 1)
[/autoit] [autoit][/autoit] [autoit]Global $MOW_State = ""
Global $New_State = ""
Global $hWindow = ""
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
Die Funktion:
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