Hallo Leute,
wie ist es möglich einem Button sowohl ein Hover- als auch ein Klick-Event zuzuweisen? Für Hover nutze ich ein UDF "GUICtrlOnHover.au3".
Danke.
Hallo Leute,
wie ist es möglich einem Button sowohl ein Hover- als auch ein Klick-Event zuzuweisen? Für Hover nutze ich ein UDF "GUICtrlOnHover.au3".
Danke.
Probiers mal mit GUIGetCursorInfo.
Da kannst du auslesen, über welchem Control sich der Mauszeiger befindet, und ob die Primärtaste (Linke Maustaste) gedrückt ist, oder nicht.
lg
Wie genau?
[autoit]$pos = GUIGetCursorInfo()
[/autoit][autoit][/autoit][autoit]Switch $pos[4]
Case $Button And $pos[2] = 1
EndSwitch
Dazu solltest du einfach die Hilfe lesen Du kannst es zum Beispiel so lösen:
[autoit]
$pos = GUIGetCursorInfo()
If $pos[4] = $DeinControl Then ; Während sich der Mauszeiger über dem Control befindet
; Dein Hover-Event
EndIf
Aber falls du zum Beispiel eine Grafik erscheinen lassen willst und diese wieder weg sein soll, wenn der Zeiger wieder weg von dem Control ist, solltest du es so lösen:
$bHoverDeinControl = False
$pos = GUIGetCursorInfo()
If $pos[4] = $DeinControl Then ; Während sich der Mauszeiger über dem Control befindet
If $bHoverDeinControl = False Then
;Deine Grafik anzeigen
$bHoverDeinControl = True
EndIf
Else
If $bHoverDeinControl = True Then
;Deine Grafik löschen
$bHoverDeinControl = False
EndIf
EndIf
Edit: Wenn du das ganze mit mehreren Buttons machen willst, dann ist auch das mit dem Switch gut:
$pos = GUIGetCursorInfo()
Switch $pos[4]
Case $DeinButton And $pos[2] = 1 ; Bei Klick auf $DeinButton
; Dein Event bei Klick
Case $DeinButton ; Bei Hover über deinem Button
; Dein Event bei Hover
EndSwitch
Super, danke! Aber der Hover im Switch funktioniert nicht. Ich muss da klicken.
Hmmmm.. Ist auch ungetestet Darf man mal deinen Code sehen?
Generell musst du schauen, ob NICHT geklickt wird.
#include <GUIConstants.au3>
$hWnd = GUICreate("Test", 250, 250)
$cInfoLabel = GUICtrlCreateLabel("Infotext", 0, 0, 250, 20)
$cButton = GUICtrlCreateButton("Button", 90, 110, 70, 30)
GUISetState()
$bcButtonHoverAllow = True
While True
$iMsg = GUIGetMsg()
$aCurInfo = GUIGetCursorInfo()
Switch $iMsg ;Normale Message-Verarbeitung
Case -3 ;EVENT_CLOSE
Exit
Case $cButton
GUICtrlSetData($cInfoLabel, "Button gedrückt.")
EndSwitch
If Not $aCurInfo[2] Then ;Wenn die Maustaste NICHT gedrückt ist...
Switch $aCurInfo[4]
Case $cButton
If $bcButtonHoverAllow Then
GUICtrlSetData($cInfoLabel, "Hover-Event!")
$bcButtonHoverAllow = False
EndIf
Case Else
$bcButtonHoverAllow = True
EndSwitch
EndIf
WEnd
[/autoit]lg
Alles anzeigenGenerell musst du schauen, ob NICHT geklickt wird.
Spoiler anzeigen
[autoit][/autoit] [autoit][/autoit] [autoit]
#include <GUIConstants.au3>$hWnd = GUICreate("Test", 250, 250)
[/autoit] [autoit][/autoit] [autoit]
$cInfoLabel = GUICtrlCreateLabel("Infotext", 0, 0, 250, 20)
$cButton = GUICtrlCreateButton("Button", 90, 110, 70, 30)GUISetState()
[/autoit] [autoit][/autoit] [autoit]
$bcButtonHoverAllow = TrueWhile True
[/autoit] [autoit][/autoit] [autoit]
$iMsg = GUIGetMsg()
$aCurInfo = GUIGetCursorInfo()
Switch $iMsg ;Normale Message-Verarbeitung
Case -3 ;EVENT_CLOSE
Exit
Case $cButton
GUICtrlSetData($cInfoLabel, "Button gedrückt.")
EndSwitchIf Not $aCurInfo[2] Then ;Wenn die Maustaste NICHT gedrückt ist...
[/autoit] [autoit][/autoit] [autoit]
Switch $aCurInfo[4]
Case $cButton
If $bcButtonHoverAllow Then
GUICtrlSetData($cInfoLabel, "Hover-Event!")
$bcButtonHoverAllow = False
EndIf
Case Else
$bcButtonHoverAllow = True
EndSwitch
EndIfWEnd
[/autoit]lg
Könntest du das auch mir bitte näher bringen? Warum ist das so?
Sonst wird dein Hover-Event auch ausgelöst, wenn geklickt wird, und nicht nur gehovert, und beißt sich somit mit dem Event, was durch GUIGetMsg ausgelöst wird.^^
lg
Achso, ja klar :pinch: Jaja, es ist doch noch sehr früh am Morgen
Aber er hat geschrieben, dass es gar nicht ausgelöst wird, oder? Weil meine Version funktioniert doch theoretisch auch (nur, dass es sich halt mit dem Klick-Event beißt), oder?
Das "And" funktioniert so nicht.
[autoit]
Switch $pos[4]
Case $DeinButton And $pos[2] = 1 ; Bei Klick auf $DeinButton
AutoIt verarbeitet das so (Als If geschrieben):
If ($DeinButton And ($pos[2] = 1)) = $pos[4]
Ich hätte das eher so gelöst:
#include <GUIConstants.au3>
$hWnd = GUICreate("Test", 250, 250)
$cInfoLabel = GUICtrlCreateLabel("Infotext", 0, 0, 250, 20)
$cButton1 = GUICtrlCreateButton("Button", 90, 110, 70, 30)
$cButton2 = GUICtrlCreateButton("Button", 90, 150, 70, 30)
GUISetState()
$bcButton1HoverAllow = True
$bcButton2HoverAllow = True
While True
$iMsg = GUIGetMsg()
$aCurInfo = GUIGetCursorInfo()
Switch $iMsg ;Normale Message-Verarbeitung
Case -3 ;EVENT_CLOSE
Exit
Case $cButton1
GUICtrlSetData($cInfoLabel, "Button 1 gedrückt. [GUIGetMsg]")
Case $cButton2
GUICtrlSetData($cInfoLabel, "Button 2 gedrückt. [GUIGetMsg]")
EndSwitch
If Not $aCurInfo[2] Then ;Wenn die Maustaste NICHT gedrückt ist...
Switch $aCurInfo[4]
Case $cButton1
If $bcButton1HoverAllow Then
GUICtrlSetData($cInfoLabel, "Hover-Event! (Button 1) [GUIGetCursorInfo]")
$bcButton1HoverAllow = False
EndIf
Case $cButton2
If $bcButton2HoverAllow Then
GUICtrlSetData($cInfoLabel, "Hover-Event! (Button 2) [GUIGetCursorInfo]")
$bcButton2HoverAllow = False
EndIf
Case Else ;Rücksetz-Funktion
$bcButton1HoverAllow = True
$bcButton2HoverAllow = True
EndSwitch
EndIf
WEnd
lg
Ja, ich glaube es ist besser ihr seht den kompletten Code. Es soll eine Art virtuelles "Game Keyboard" werden. Mit Pfeilen zum scrollen oder Figur steuern. Die Leertaste ist sticky. Mit der Checkbox soll zwischen Hover- und Klick-Funktion der "Pfeiltasten" gewechselt werden. Am liebsten auch mit "Space down" beim ersten hovern und "Space up" beim zweiten hovern.
Edit: Für Browser-Games in Chrome.
Edit2: Link zum GUICtrlSetOnHover UDF. Hoffe, das ist ok?
Wie gesagt.. früh am morgen
Also gut, ich glaub das wird auch noch für mich nützlich Dankeschön!
chesstiger : Der Code von dir gibt leider eine Fehlermeldung aus, wenn ich außerhalb des Fensters klicke:
Vorher eine Überprüfung mit IsArray einbauen.
Ich gebe zu, daran habe ich in dem Moment auch nicht gedacht.^^
lg
Es sollte genügen $aCurInfo auf Arraystatus zu überprüfen:
#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]$hWnd = GUICreate("Test", 250, 250)
$cInfoLabel = GUICtrlCreateLabel("Infotext", 0, 0, 250, 20)
$cButton1 = GUICtrlCreateButton("Button", 90, 110, 70, 30)
$cButton2 = GUICtrlCreateButton("Button", 90, 150, 70, 30)
GUISetState()
$bcButton1HoverAllow = True
$bcButton2HoverAllow = True
While True
$iMsg = GUIGetMsg()
$aCurInfo = GUIGetCursorInfo()
Switch $iMsg ;Normale Message-Verarbeitung
Case -3 ;EVENT_CLOSE
Exit
Case $cButton1
GUICtrlSetData($cInfoLabel, "Button 1 gedrückt. [GUIGetMsg]")
Case $cButton2
GUICtrlSetData($cInfoLabel, "Button 2 gedrückt. [GUIGetMsg]")
EndSwitch
If IsArray($aCurInfo) And Not $aCurInfo[2] Then ;Wenn die Maustaste NICHT gedrückt ist...
Switch $aCurInfo[4]
Case $cButton1
If $bcButton1HoverAllow Then
GUICtrlSetData($cInfoLabel, "Hover-Event! (Button 1) [GUIGetCursorInfo]")
$bcButton1HoverAllow = False
EndIf
Case $cButton2
If $bcButton2HoverAllow Then
GUICtrlSetData($cInfoLabel, "Hover-Event! (Button 2) [GUIGetCursorInfo]")
$bcButton2HoverAllow = False
EndIf
Case Else ;Rücksetz-Funktion
$bcButton1HoverAllow = True
$bcButton2HoverAllow = True
EndSwitch
EndIf
WEnd
Edit: Ein wenig spät...
Wie leite ich den Befehl aus der Hover-Funktion an ein anderes Fenster weiter? Mit der UDF geht's so. Ich wollte eigentlich nur, dass ich bei den Buttons durch die Checkbox die "Hover-Sensitivität" abschalte und die Buttons für die Dauer die die Maustaste gehalten wird eine Funktion ausführen.
Wie leite ich den Befehl aus der Hover-Funktion an ein anderes Fenster weiter? Mit der UDF geht's so.
Wenn du schon weist das es geht dann mach es so wie in dem hier nicht vorliegenden Beispiel wo es geht.
Es soll eine Art virtuelles "Game Keyboard" werden
Du solltest dir die Forenregeln durchlesen. Spielebots werden hier nicht unterstützt und ich konnte keinerlei Anzeichen dafür finden dass es die Steuerung für dein Spieleskript ist.
Daher: Vote for Close
mfg autoBert
Ich glaube hier liegt ein Missverständnis vor:
1. Meinen Code habe ich unter 12 gepostet.
2. Das "Game Keyboard" ist kein Spielebot! Ich habe es für Anno Online programmiert, da ich durch meine Behinderung nur eine Bluetooth-Maus mit dem Joystick meines Elektro-Rollstuhls steuern kann. Aufgrund technischer Limitierungen ist es nicht möglich die rechte Maustaste zum scrollen gedrückt zu halten. Ich wollte den Code nur etwas optimieren. => quasi eine Bildschirmtastatur; kein Cheating, kein Bot, etc.
Vote against Close
Auch auf die Gefahr hin, dass du auf der Mitleidsmasche reist:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include "GUICtrl_SetOnHover\GUICtrlOnHover.au3"
Opt("GUIOnEventMode", 1)
Global $hWnd = "[CLASS:Chrome_WidgetWin_1]" ;MozillaWindowClass
$Form1 = GUICreate("Game Keyboard", 213, 129, -1, -1, -1, $WS_EX_TOPMOST)
$Button1 = GUICtrlCreateButton("Space", 8, 72, 91, 25)
;GUICtrlSetOnEvent(-1, "_Space")
$Button2 = GUICtrlCreateButton("U", 40, 10, 27, 25)
_GUICtrl_OnHoverRegister(-1, "_Hover_Func", "_Hover_Func")
GUICtrlSetOnEvent(-1, "_Click_Func2")
$Button3 = GUICtrlCreateButton("D", 40, 40, 27, 25)
_GUICtrl_OnHoverRegister(-1, "_Hover_Func", "_Hover_Func")
$Button4 = GUICtrlCreateButton("L", 8, 40, 27, 25)
_GUICtrl_OnHoverRegister(-1, "_Hover_Func", "_Hover_Func")
$Button5 = GUICtrlCreateButton("R", 73, 40, 27, 25)
_GUICtrl_OnHoverRegister(-1, "_Hover_Func", "_Hover_Func")
$Checkbox1 = GUICtrlCreateCheckbox("&Hover active", 112, 48, 81, 17)
GUICtrlSetState($Checkbox1, $GUI_CHECKED)
GUICtrlSetOnEvent(-1, '_CheckIt')
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
GUISetOnEvent($GUI_EVENT_CLOSE, "hGUIClose")
While 1
Sleep(1000)
WEnd
Func _CheckIt()
If BitAND(GUICtrlRead($Checkbox1), $GUI_CHECKED) Then
_GUICtrl_OnHoverRegister($Button2, "_Hover_Func", "_Hover_Func")
_GUICtrl_OnHoverRegister($Button3, "_Hover_Func", "_Hover_Func")
_GUICtrl_OnHoverRegister($Button4, "_Hover_Func", "_Hover_Func")
_GUICtrl_OnHoverRegister($Button5, "_Hover_Func", "_Hover_Func")
GUICtrlSetOnEvent($Button2, "")
GUICtrlSetOnEvent($Button3, "")
GUICtrlSetOnEvent($Button4, "")
GUICtrlSetOnEvent($Button5, "")
Else
_GUICtrl_OnHoverRegister($Button2, "", "")
_GUICtrl_OnHoverRegister($Button3, "", "")
_GUICtrl_OnHoverRegister($Button4, "", "")
_GUICtrl_OnHoverRegister($Button5, "", "")
GUICtrlSetOnEvent($Button2, "_Click_Func3")
GUICtrlSetOnEvent($Button3, "_Click_Func3")
GUICtrlSetOnEvent($Button4, "_Click_Func4")
GUICtrlSetOnEvent($Button5, "_Click_Func5")
EndIf
EndFunc ;==>_CheckIt
Func _Hover_Func($iCtrlID, $iParam)
Local $sButton2_Action = "{UP DOWN}"
Local $sButton3_Action = "{DOWN DOWN}"
Local $sButton4_Action = "{LEFT DOWN}"
Local $sButton5_Action = "{RIGHT DOWN}"
If $iParam = 2 Then ;Indicates On *Leave* Hover process
$sButton2_Action = "{UP UP}"
$sButton3_Action = "{DOWN UP}"
$sButton4_Action = "{LEFT UP}"
$sButton5_Action = "{RIGHT UP}"
EndIf
Switch $iCtrlID
Case $Button2
ConsoleWrite($sButton2_Action & @CRLF)
Case $Button3
ConsoleWrite($sButton3_Action & @CRLF)
Case $Button4
ConsoleWrite($sButton4_Action & @CRLF)
Case $Button5
ConsoleWrite($sButton5_Action & @CRLF)
EndSwitch
EndFunc ;==>_Hover_Func
[/autoit] [autoit][/autoit] [autoit]Func _Click_Func2()
MsgBox(0, 'Clickfunc', '2', 4, $Form1)
EndFunc ;==>_Click_Func3
Func _Click_Func3()
MsgBox(0, 'Clickfunc', '3', 4, $Form1)
EndFunc ;==>_Click_Func3
Func _Click_Func4()
MsgBox(0, 'Clickfunc', '4', 4, $Form1)
EndFunc ;==>_Click_Func4
Func _Click_Func5()
MsgBox(0, 'Clickfunc', '5', 4, $Form1)
EndFunc ;==>_Click_Func5
Func hGUIClose()
Exit
EndFunc ;==>hGUIClose
Ich habe das Skript so abgeändert das man das Schema erkennt. Die Spacetaste habe ich komplett ignoriert.
mfg autoBert