Bei zweitem Fenster funktioniert "GUISetOnEvent($GUI_EVENT_PRIMARYDOWN,..." nicht

  • Mein Programm erzeugt zunächst ein Fenster "zzzzzzzzzzz".
    Wenn ich dort mit der rechten Maustaste hineinklicke, erscheint ein kleine Fenster.
    Ich erwarte nun, dass die MsgBox "xxxxx" erscheint, wenn ich in das kleine Fenster mit der linken Maustaste klicke.
    Aber das funktioniert nicht. Was habe ich falsch gemacht?


    [autoit]


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

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

    Opt('GUIOnEventMode', 1)
    $winhandle=GUICreate("zzzzzzzzzz",500 ,300,400,400)
    GUISetOnEvent($GUI_EVENT_SECONDARYUP, '_KlickRightUP')
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseWindow')
    GUISetState()
    WinWaitClose($winhandle)

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

    Func _CloseWindow()
    GUIDelete($winhandle)
    EndFunc

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

    Func _KlickRightUp()
    Kontextmenue()
    GUIDelete ( $winhandle)
    EndFunc

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

    Func Kontextmenue()
    $kontexthandle=GUICreate("",60,100,430,430,$WS_POPUPWINDOW )
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_KlickDownKon')
    GUISetState()
    WinWaitClose($kontexthandle)
    EndFunc

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

    Func _KlickDownKon()
    MsgBox(0,"xxxxx","xxxxx")
    GUIDelete ( $kontexthandle)
    EndFunc

    [/autoit]

    Nebenbei noch eine andere Frage: Wie erzeuge ich einen Spoiler? Wenn ich auf den SP-Button klicke und dann zwischen Spoiler und /spoiler
    den Programmtext kopiere entsteht zwar ein Spoiler, der wird aber nicht in der SciTE-Form dargestellt, sondern nur in schwarzer Schrift.


    Spoiler anzeigen


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

    Opt('GUIOnEventMode', 1)
    $winhandle=GUICreate("zzzzzzzzzz",500 ,300,400,400)
    GUISetOnEvent($GUI_EVENT_SECONDARYUP, '_KlickRightUP')
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseWindow')
    GUISetState()
    WinWaitClose($winhandle)

    Func _CloseWindow()
    GUIDelete($winhandle)
    EndFunc

    Func _KlickRightUp()
    Kontextmenue()
    GUIDelete ( $winhandle)
    EndFunc

    Func Kontextmenue()
    $kontexthandle=GUICreate("",60,100,430,430,$WS_POPUPWINDOW )
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_KlickDownKon')
    GUISetState()
    WinWaitClose($kontexthandle)
    EndFunc

    Func _KlickDownKon()
    MsgBox(0,"xxxxx","xxxxx")
    GUIDelete ( $kontexthandle)
    EndFunc

    Einmal editiert, zuletzt von DOheim (28. März 2014 um 17:01)

  • Ganz einfach: Weil WinWaitClose() dein Programm vollkommen durcheinander wirft.
    Für gewöhnlich verwendet man eine Schleife die verhindert dass dein Programm verlassen wird.
    Zudem solltest du dir angewöhnen alles zu deklarieren was vorher deklarierbar ist.

    Das heißt:
    Definiere am Anfang deines Programmes ruhig alle GUI's die du im späteren Programm anzeigen möchtest. Du kannst diese ja einfach mit GUISetState() anzeigen oder ausblenden. Zudem schmeißt mir die SciTE ein ERROR entgegen, weil deine Variable $kontexthandle nicht global definiert ist. Siehe dir doch einmal das Tutorial von chesstiger an: http://www.autoit.de/index.php?page=Thread&threadID=31948

    Hier einmal eine Musterlösung:

    Spoiler anzeigen
    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>

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

    Opt('GUIOnEventMode', 1)

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

    Global $hMain, $hChild

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $hMain = GUICreate('zzzzzzzzzz', 500, 300, 400, 400)
    GUISetOnEvent($GUI_EVENT_CLOSE, 'GUI_EVENT_CLOSE')
    GUISetOnEvent($GUI_EVENT_SECONDARYUP, 'GUI_EVENT_SECONDARYUP')

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

    $hChild = GUICreate('', 60, 100, 430, 430, $WS_POPUPWINDOW, -1, $hMain)
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, 'GUI_EVENT_PRIMARYDOWN')
    GUISetOnEvent($GUI_EVENT_SECONDARYUP, 'GUI_EVENT_SECONDARYUP')

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

    GUISetState(@SW_SHOW, $hMain)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    While Sleep(10)
    WEnd

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func GUI_EVENT_CLOSE()
    Exit
    EndFunc

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

    Func GUI_EVENT_SECONDARYUP()
    Local Static $bState
    $bState = Not $bState
    ($bState) ? (GUISetState(@SW_SHOW, $hChild)) : (GUISetState(@SW_HIDE, $hChild))
    EndFunc

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

    Func GUI_EVENT_PRIMARYDOWN()
    MsgBox(0, 'xxxxx', 'xxxxx', 0, $hChild)
    GUI_EVENT_SECONDARYUP()
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]

    Um ein AutoIt Code in einen Spoiler zu setzen benutze folgenden BB-Code: [ spoiler ] [ autoit ] CODE [ /autoit ] [ /spoiler ]

    Einmal editiert, zuletzt von Yjuq (21. Februar 2014 um 00:42)

  • Recht herzlichen Dank für die ausführliche Antwort, Make Grafik,
    da muss ich mein Programm ja ganz schön umorganisieren. Es hat schließlich schon 938 Befehlszeilen, und ich wollte nur "schnell mal" das mit den Kontextmenüs ergänzen. Da hat Hänschen aber die Rechnung ohne den Wirt gemacht.
    Mit einer Zeile Deines Programms kommt mein SciTE ( und ich auch ) nicht klar. Es erscheint:

    >"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "D:\AU\#Test\Test4.au3"
    D:\AU\#Test\Test4.au3 (36) : ==> Unable to parse line.:
    ($bState) ? (GUISetState(@SW_SHOW, $hChild)) : (GUISetState(@SW_HIDE, $hChild))
    ($bState) ^ ERROR
    >Exit code: 1 Time: 0.215

    Es wäre nett, wenn Du dazu noch etwas sagen könntest.
    Aber wundere Dich bitte nicht, wenn ich darauf dann nicht gleich reagiere. Denn heute Nacht geht es ab in den Urlaub.
    Nochmals vielen Dank!
    Gruß
    Dieter

    • Offizieller Beitrag

    ($bState) ? (GUISetState(@SW_SHOW, $hChild)) : (GUISetState(@SW_HIDE, $hChild))


    Das ist ein ternärer Operator und seit der 3.3.10.. in der Stable. Ich vermute mal, du hast eine ältere Version. Kannst du auch als ganz normales If-Then-Else schreiben. Ternäre Operatoren sind ausschließlich "Syntactic Sugar". Wer es also süß mag... ;)