Wechsel zwischen Hover- und Klick-Funktion

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

    Einmal editiert, zuletzt von btcode (6. April 2013 um 17:06)

  • Wie genau?

    [autoit]

    $pos = GUIGetCursorInfo()

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

    Switch $pos[4]
    Case $Button And $pos[2] = 1
    EndSwitch

    [/autoit]
  • Dazu solltest du einfach die Hilfe lesen ;) Du kannst es zum Beispiel so lösen:

    [autoit]


    $pos = GUIGetCursorInfo()

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

    If $pos[4] = $DeinControl Then ; Während sich der Mauszeiger über dem Control befindet
    ; Dein Hover-Event
    EndIf

    [/autoit]

    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:

    Spoiler anzeigen
    [autoit]


    $bHoverDeinControl = False
    $pos = GUIGetCursorInfo()

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

    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

    [/autoit]


    Edit: Wenn du das ganze mit mehreren Buttons machen willst, dann ist auch das mit dem Switch gut:

    Spoiler anzeigen
    [autoit]


    $pos = GUIGetCursorInfo()

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

    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

    [/autoit]

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

  • Hmmmm.. Ist auch ungetestet :D Darf man mal deinen Code sehen?

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

  • Generell musst du schauen, ob NICHT geklickt wird. ;)

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>

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

    $hWnd = GUICreate("Test", 250, 250)
    $cInfoLabel = GUICtrlCreateLabel("Infotext", 0, 0, 250, 20)
    $cButton = GUICtrlCreateButton("Button", 90, 110, 70, 30)

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

    GUISetState()
    $bcButtonHoverAllow = True

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

    While True
    $iMsg = GUIGetMsg()
    $aCurInfo = GUIGetCursorInfo()
    Switch $iMsg ;Normale Message-Verarbeitung
    Case -3 ;EVENT_CLOSE
    Exit
    Case $cButton
    GUICtrlSetData($cInfoLabel, "Button gedrückt.")
    EndSwitch

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

    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

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

    WEnd

    [/autoit]

    lg


  • Könntest du das auch mir bitte näher bringen? :) Warum ist das so?

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

  • Achso, ja klar :pinch: Jaja, es ist doch noch sehr früh am Morgen :whistling:
    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?

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

  • Das "And" funktioniert so nicht.

    [autoit]


    Switch $pos[4]
    Case $DeinButton And $pos[2] = 1 ; Bei Klick auf $DeinButton

    [/autoit]


    AutoIt verarbeitet das so (Als If geschrieben):

    [autoit]


    If ($DeinButton And ($pos[2] = 1)) = $pos[4]

    [/autoit]

    ;)

    Ich hätte das eher so gelöst:

    Spoiler anzeigen
    [autoit]


    #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)

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

    GUISetState()
    $bcButton1HoverAllow = True
    $bcButton2HoverAllow = True

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

    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

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

    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

    [/autoit]

    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 :D
    Also gut, ich glaub das wird auch noch für mich nützlich :) Dankeschön! :)

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

  • chesstiger : Der Code von dir gibt leider eine Fehlermeldung aus, wenn ich außerhalb des Fensters klicke:

    Code
    Subscript used with non-Array variable.:
    If Not $aCurInfo[2] Then
    If Not $aCurInfo^ ERROR
  • Es sollte genügen $aCurInfo auf Arraystatus zu überprüfen:

    Spoiler anzeigen
    [autoit]

    #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)

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

    GUISetState()
    $bcButton1HoverAllow = True
    $bcButton2HoverAllow = True

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

    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

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

    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

    [/autoit]

    Edit: Ein wenig spät... :whistling:

  • 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:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include "GUICtrl_SetOnHover\GUICtrlOnHover.au3"
    Opt("GUIOnEventMode", 1)
    Global $hWnd = "[CLASS:Chrome_WidgetWin_1]" ;MozillaWindowClass

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

    $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 ###

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

    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

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

    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}"

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

    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

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

    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

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

    EndFunc ;==>_Hover_Func

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

    Func _Click_Func2()
    MsgBox(0, 'Clickfunc', '2', 4, $Form1)
    EndFunc ;==>_Click_Func3

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

    Func _Click_Func3()
    MsgBox(0, 'Clickfunc', '3', 4, $Form1)
    EndFunc ;==>_Click_Func3

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

    Func _Click_Func4()
    MsgBox(0, 'Clickfunc', '4', 4, $Form1)
    EndFunc ;==>_Click_Func4

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

    Func _Click_Func5()
    MsgBox(0, 'Clickfunc', '5', 4, $Form1)
    EndFunc ;==>_Click_Func5

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

    Func hGUIClose()
    Exit
    EndFunc ;==>hGUIClose

    [/autoit]

    Ich habe das Skript so abgeändert das man das Schema erkennt. Die Spacetaste habe ich komplett ignoriert.

    mfg autoBert