Prüfen auf Rechtsklick mit _isPressed

  • Hallo,

    ich habe eine GUI und möchte prüfen, ob die rechte Maustaste gedrückt wurde um dann darauf reagieren. Ich dachte mir eigentlich dass es folgendermaßen geht:

    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 454, 192, 114)
    $Button1 = GUICtrlCreateButton("Button1", 192, 192, 211, 97, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    $vUser32Dll = DllOpen("user32.dll")

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

    While True
    $msg = GUIGetMsg()
    switch $msg
    case $Button1
    MsgBox(1, "Button1", "Button1 wurde gedrückt")
    case _ispressed("03", $vUser32Dll)
    MsgBox(1, "Rechte Maustaste", "Du hast die rechte Maustaste gedrückt")
    case $GUI_EVENT_CLOSE
    Exit
    DllClose($vUser32Dll)
    EndSwitch
    WEnd

    [/autoit]


    Tuts aber leider nicht :whistling: Die Aktion die ausgeführt werden soll, führt er immer im jeden Durchgang der Schleife aus! Wo liegt mein Fehler?
    Wenn ich _isPressed(..) = True schreibe, bringt das genauso wenig. Oder verträgt sich das mit dem Switch/Case nicht?

    2 Mal editiert, zuletzt von Scritch (20. Juli 2011 um 11:27)

    • Offizieller Beitrag

    Warum benutzt Du nicht $GUI_EVENT_SECONDARYUP?

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 454, 192, 114)
    $Button1 = GUICtrlCreateButton("Button1", 192, 192, 211, 97, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While True
    $msg = GUIGetMsg()
    switch $msg
    case $Button1
    MsgBox(1, "Button1", "Button1 wurde gedrückt")
    case $GUI_EVENT_SECONDARYUP
    MsgBox(1, "Rechte Maustaste", "Du hast die rechte Maustaste gedrückt")
    case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]
  • Weil ich nicht wusste, dass es sowas gibt :pinch: Danke.
    Aber vom Prinzip und Verständnis her zu meiner Lösung nochmal: Wieso funktioniert das nicht?
    Gibs eine Übersicht mit diesen ganzen Eventhandlern?

  • So, die eigentliche Problematig hatte sich ja erledigt, habe aber jetzt eine neue, die mit der alten in Verbindung steht:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include "MouseOnEvent.au3"
    #Include <Misc.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 468, 343, 192, 114)
    $Group1 = GUICtrlCreateGroup("Ändern", 72, 72, 185, 105)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $plus = GUICtrlCreateButton("+", 336, 96, 27, 25, $WS_GROUP)
    $minus = GUICtrlCreateButton("-", 368, 96, 50, 50, $WS_GROUP)
    $label1 = GUICtrlCreateLabel("lala", 1, 1, 40, 40)

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    $hot = HotKeySet("{a}", "msgbox1")
    $vUser32Dll = DllOpen("user32.dll")

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

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    case $GUI_EVENT_SECONDARYUP
    While _IsPressed("02", $vUser32Dll)
    MsgBox(1, "lala", "lala")
    WEnd
    EndSwitch
    $mausinfo = GUIGetCursorInfo($Form1)
    GUICtrlSetData($label1, $mausinfo[4])
    wend

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

    func msgbox1()
    _MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "scrollunten")
    EndFunc

    Func scrollunten()

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

    $controlinfo = ControlGetPos($Form1, "", $mausinfo[4])
    $verhaeltnis = $controlinfo[2] / $controlinfo[3]
    $neuebreite = $controlinfo[2] * 0.98
    $neuehoehe = $neuebreite / $verhaeltnis
    GUICtrlSetPos ($mausinfo[4], $controlinfo[0], $controlinfo[1], $neuebreite, $neuehoehe)

    EndFunc

    [/autoit]

    Zu einem späteren Zeitpunkt wollte ich es mal machen, dass beim Rechtsklick + Scrollen die Größe von Controls verändert werden kann. Aber auf meine gedrückte rechte Maustaste wird gar nicht reagiert. Wie kommt?

    • Offizieller Beitrag

    Aber auf meine gedrückte rechte Maustaste wird gar nicht reagiert. Wie kommt?


    Dort mußt du $GUI_EVENT_SECONDARYDOWN auswerten. Tritt dieses Ereignis ein wurde die Taste gedrückt und solange $GUI_EVENT_SECONDARYUP NICHT eintritt ist sie es immer noch. Am besten also den Status der Taste setzen in einer Variable, die mit $GUI_EVENT_SECONDARYDOWN auf 'True' und mit $GUI_EVENT_SECONDARYUP auf 'False' gesetzt wird. Das kannst du dann in Kombination mit dem Wheelscroll weiterverwerten.

  • Klingt logisch, was du sagts. Weiß es aber irgendwie nicht umzusetzen. Ist es möglich auf Aktionen im GUI zu reagieren, ohne Switch... Case und ohne GUIonEventMode einzusetzen?

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include "MouseOnEvent.au3"
    #Include <Misc.au3>

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

    global $zaehler

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 468, 343, 192, 114)
    $Group1 = GUICtrlCreateGroup("Ändern", 72, 72, 185, 105)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $plus = GUICtrlCreateButton("+", 336, 96, 27, 25, $WS_GROUP)
    $minus = GUICtrlCreateButton("-", 368, 96, 50, 50, $WS_GROUP)
    $label1 = GUICtrlCreateLabel("lala", 1, 1, 40, 40)
    $label2 = GUICtrlCreateLabel("blabla", 50, 50, 40, 20)

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ;~ $hot = HotKeySet("{a}", "msgbox1")
    $vUser32Dll = DllOpen("user32.dll")

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

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    case $GUI_EVENT_SECONDARYDOWN
    While _IsPressed("02", $vUser32Dll)
    _MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "scrollunten")
    _MouseSetOnEvent($MOUSE_WHEELSCROLLup_EVENT, "scrolloben")
    WEnd
    Case $GUI_EVENT_SECONDARYUP
    _MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT)
    _MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT)
    EndSwitch
    WEnd

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

    Func scrollunten()
    $mausinfo = GUIGetCursorInfo($Form1)
    $controlinfo = ControlGetPos($Form1, "", $mausinfo[4])
    $verhaeltnis = $controlinfo[2] / $controlinfo[3]
    $neuebreite = $controlinfo[2] * 0.95
    $neuehoehe = $neuebreite / $verhaeltnis
    GUICtrlSetPos ($mausinfo[4], $controlinfo[0], $controlinfo[1], $neuebreite, $neuehoehe)
    endFunc

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

    func scrolloben()
    $mausinfo = GUIGetCursorInfo($Form1)
    $controlinfo = ControlGetPos($Form1, "", $mausinfo[4])
    $verhaeltnis = $controlinfo[2] / $controlinfo[3]
    $neuebreite = $controlinfo[2] * 1.05
    $neuehoehe = $neuebreite / $verhaeltnis
    GUICtrlSetPos ($mausinfo[4], $controlinfo[0], $controlinfo[1], $neuebreite, $neuehoehe)
    EndFunc

    [/autoit]

    Edit: Mein Problem hat sich erledigt. Trotzdem interessiert mich die Sache noch,welche ganzen Alternative es gibt, um auf GUI-Eingabe zu reagieren.

    2 Mal editiert, zuletzt von Scritch (20. Juli 2011 um 10:40)

    • Offizieller Beitrag

    Ich nutze die MouseOnEvent.au3 nicht, letzlich macht diese aber nichts anderes, als ich im folgenden Skript - nämlich das Wheel-Event auswerten.
    Im Bsp. siehst du, wie nur bei gedrückter rechter Maustaste eine Zählervariable mit dem Mausrad hoch- oder runtergezählt wird, je nach Richtung (vorwärts "+", rückwärts "-").

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    OnAutoItExitRegister('OnAutoItExit')

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

    Global Const $HC_ACTION = 0
    Global $hStub_MouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam")
    Global $hmod = _WinAPI_GetModuleHandle(0)
    Global $hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), $hmod)

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

    Global $SecMousState = False
    Global $WheelCount

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

    $gui = GUICreate('Test')
    GUISetState()

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

    While True
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $GUI_EVENT_SECONDARYDOWN
    If Not $SecMousState Then
    $SecMousState = True
    $WheelCount = 0
    EndIf
    Case $GUI_EVENT_SECONDARYUP
    If $SecMousState Then $SecMousState = False
    EndSwitch
    WEnd

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

    Func _Wheel($iCount)
    $WheelCount += $iCount
    ConsoleWrite($WheelCount & @CRLF) ; hier kannst du dein Skript ausführen
    EndFunc

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

    Func _MouseProc($nCode, $wParam, $lParam)
    Local $event, $info, $iX, $iY, $mouseData = "", $wheelData = "", $iWheelCount
    $info = DllStructCreate("int X;int Y;dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo", $lParam)
    $iX = DllStructGetData($info, 1)
    $iY = DllStructGetData($info, 2)
    $mouseData = DllStructGetData($info, 3)
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    If $nCode = $HC_ACTION Then
    Switch $wParam
    Case $WM_MOUSEWHEEL
    $iWheelCount = _WinAPI_HiWord($mouseData)/120
    If $SecMousState Then _Wheel($iWheelCount)
    EndSwitch
    EndIf
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndFunc

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

    Func OnAutoItExit()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hStub_MouseProc)
    EndFunc ;==>OnAutoItExit

    [/autoit]