Maus-Event wird nicht erkannt, wenn Child angezeigt

    • Offizieller Beitrag

    Hi,
    folgendes Problem:
    Auf einer Main-Gui blende ich ein Child ein. Jedoch sind dann die Events (MausUp/Down) nicht mehr verfügbar.
    Der Button hat mehrere, zeitgesteuerte Funktionen. Beschreibung auf GUI unter dem Button.
    Hat jemand vielleicht eine Idee, wie ich das Problem lösen kann?

    Hier der Code, beschränkt auf die Problemsituation:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>

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

    Opt('GUIOnEventMode', 1)
    Opt('MustDeclareVars', 1)

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

    Global $Gui0, $btStartStop, $lbSnooze, $aChild[2] = [1]
    Global $TimerStart, $iTime, $EngineRun = 0, $iSnooze = 0

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

    _Create_Gui_0()
    _CreateChild($aChild[1])
    GUISetState(@SW_SHOW, $Gui0)
    ;~ GUISetState(@SW_SHOWNOACTIVATE, $aChild[1]) ; <=== Sowie das Child angezeigt wird, werden die Events ($GUI_EVENT_PRIMARYDOWN & $GUI_EVENT_PRIMARYUP) nicht mehr erkannt

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

    While 1
    Sleep(50)
    WEnd

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

    Func _Create_Gui_0()
    $Gui0 = GUICreate('Engine OFF', 400, 450)
    $lbSnooze = GUICtrlCreateLabel('SNOOZE', 280, 150)
    GUICtrlSetState(-1, $GUI_HIDE)
    $btStartStop = GUICtrlCreateButton('0 / I', 90, 280, 210, 25)

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

    GUICtrlCreateLabel('Button 1,5 sec gedrückt halten für Start / Stopp.' & @LF & 'Wenn gestartet mit kurzem Druck "SNOOZE" de/aktivieren.', 50, 310)

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

    ; == Events
    GUISetOnEvent(-3, '_close_Gui0', $Gui0)
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_MDown', $Gui0)
    GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_MUp', $Gui0)
    EndFunc ;==>_Create_Gui_0

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

    Func _CreateChild(ByRef $_hWnd)
    $_hWnd = GUICreate('', 254, 130, 70, 60, 0x80000000, 0x00000040, $Gui0) ; WS_POPUP = 0x80000000, WS_EX_MDICHILD = 0x00000040
    GUISetBkColor(0x06A533, $_hWnd)
    EndFunc ;==>_CreateChild

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

    Func _MDown()
    Local $aInfo = GUIGetCursorInfo()
    If Not IsArray($aInfo) Then Return
    If $aInfo[4] = $btStartStop Then
    $TimerStart = TimerInit()
    AdlibRegister('_StartEngine')
    EndIf
    EndFunc ;==>_MDown

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

    Func _MUp()
    Local $aInfo = GUIGetCursorInfo()
    If Not IsArray($aInfo) Then Return
    Local $iState = $GUI_SHOW
    If $aInfo[4] = $btStartStop Then
    If $iTime <= 400 And $EngineRun = 1 Then
    If $iSnooze = 0 Then
    $iSnooze = 1
    Else
    $iState = $GUI_HIDE
    $iSnooze = 0
    EndIf
    GUICtrlSetState($lbSnooze, $iState)
    AdlibUnRegister('_StartEngine')
    ElseIf $iTime <= 1500 And $EngineRun = 0 Then
    AdlibUnRegister('_StartEngine')
    EndIf
    EndIf
    EndFunc ;==>_MUp

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

    Func _StartEngine()
    $iTime = TimerDiff($TimerStart)
    Local $iState = $GUI_SHOW, $aTitle[2] = ['Engine OFF','Engine ON']
    If $iTime >= 1500 And $iSnooze = 0 Then
    $EngineRun = Not $EngineRun
    Beep(1700)
    AdlibUnRegister('_StartEngine')
    WinSetTitle($Gui0, '', $aTitle[$EngineRun])
    EndIf
    EndFunc ;==>_StartEngine

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

    Func _close_Gui0()
    Exit
    EndFunc

    [/autoit]
  • so funktioniert es (bei mir ) :

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>

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

    Opt('GUIOnEventMode', 1)
    Opt('MustDeclareVars', 1)

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

    Global $Gui0, $btStartStop, $lbSnooze, $aChild[2] = [1]
    Global $TimerStart, $iTime, $EngineRun = 0, $iSnooze = 0

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

    _Create_Gui_0()
    _CreateChild($aChild[1])
    GUISetState(@SW_SHOW, $Gui0)
    GUISetState(@SW_SHOWNOACTIVATE, $aChild[1]) ; <=== Sowie das Child angezeigt wird, werden die Events ($GUI_EVENT_PRIMARYDOWN & $GUI_EVENT_PRIMARYUP) nicht mehr erkannt
    GUISwitch($Gui0)

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

    While 1
    Sleep(50)
    WEnd

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

    Func _Create_Gui_0()
    $Gui0 = GUICreate('Engine OFF', 400, 450)
    $lbSnooze = GUICtrlCreateLabel('SNOOZE', 280, 150)
    GUICtrlSetState(-1, $GUI_HIDE)
    $btStartStop = GUICtrlCreateButton('0 / I', 90, 280, 210, 25)

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

    GUICtrlCreateLabel('Button 1,5 sec gedrückt halten für Start / Stopp.' & @LF & 'Wenn gestartet mit kurzem Druck "SNOOZE" de/aktivieren.', 50, 310)

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

    ; == Events
    GUISetOnEvent(-3, '_close_Gui0', $Gui0)
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_MDown', $Gui0)
    GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_MUp', $Gui0)
    EndFunc ;==>_Create_Gui_0

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

    Func _CreateChild(ByRef $_hWnd)
    $_hWnd = GUICreate('', 254, 130, 70, 60, 0x80000000, 0x00000040, $Gui0) ; WS_POPUP = 0x80000000, WS_EX_MDICHILD = 0x00000040
    GUISetBkColor(0x06A533, $_hWnd)
    EndFunc ;==>_CreateChild

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

    Func _MDown()
    Local $aInfo = GUIGetCursorInfo()
    If Not IsArray($aInfo) Then Return
    If $aInfo[4] = $btStartStop Then
    $TimerStart = TimerInit()
    AdlibRegister('_StartEngine')
    EndIf
    EndFunc ;==>_MDown

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

    Func _MUp()
    Local $aInfo = GUIGetCursorInfo()
    If Not IsArray($aInfo) Then Return
    Local $iState = $GUI_SHOW
    If $aInfo[4] = $btStartStop Then
    If $iTime <= 400 And $EngineRun = 1 Then
    If $iSnooze = 0 Then
    $iSnooze = 1
    Else
    $iState = $GUI_HIDE
    $iSnooze = 0
    EndIf
    GUICtrlSetState($lbSnooze, $iState)
    AdlibUnRegister('_StartEngine')
    ElseIf $iTime <= 1500 And $EngineRun = 0 Then
    AdlibUnRegister('_StartEngine')
    EndIf
    EndIf
    EndFunc ;==>_MUp

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

    Func _StartEngine()
    $iTime = TimerDiff($TimerStart)
    Local $iState = $GUI_SHOW, $aTitle[2] = ['Engine OFF','Engine ON']
    If $iTime >= 1500 And $iSnooze = 0 Then
    $EngineRun = Not $EngineRun
    Beep(1700)
    AdlibUnRegister('_StartEngine')
    WinSetTitle($Gui0, '', $aTitle[$EngineRun])
    EndIf
    EndFunc ;==>_StartEngine

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

    Func _close_Gui0()
    Exit
    EndFunc

    [/autoit]


    hab einfach ein GUISwitch nach dem Anzeigen des Child-Fensters hinzugefügt.

    mfg Alcros

    • Offizieller Beitrag
    Spoiler anzeigen
    [autoit]

    #Region - Timestamp
    ; 2013-02-06 17:56:24
    #EndRegion

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

    #include <GuiConstants.au3>

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

    Opt('GUIOnEventMode', 1)
    Opt('MustDeclareVars', 1)

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

    Global $Gui0, $btStartStop, $lbSnooze, $aChild[2] = [1]
    Global $TimerStart, $iTime, $EngineRun = 0, $iSnooze = 0

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

    _Create_Gui_0()
    _CreateChild($aChild[1])
    GUISetState(@SW_SHOW, $Gui0)
    GUISetState(@SW_SHOWNOACTIVATE, $aChild[1]) ; <=== Sowie das Child angezeigt wird, werden die Events ($GUI_EVENT_PRIMARYDOWN & $GUI_EVENT_PRIMARYUP) nicht mehr erkannt

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

    While 1
    Sleep(50)
    WEnd

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

    Func _Create_Gui_0()
    $Gui0 = GUICreate('Engine OFF', 400, 450)
    $lbSnooze = GUICtrlCreateLabel('SNOOZE', 280, 150)
    GUICtrlSetState(-1, $GUI_HIDE)
    $btStartStop = GUICtrlCreateButton('0 / I', 90, 280, 210, 25)

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

    GUICtrlCreateLabel('Button 1,5 sec gedrückt halten für Start / Stopp.' & @LF & 'Wenn gestartet mit kurzem Druck "SNOOZE" de/aktivieren.', 50, 310)

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

    ; == Events
    GUISetOnEvent(-3, '_close_Gui0', $Gui0)
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_MDown',$Gui0)
    GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_MUp',$Gui0)
    EndFunc ;==>_Create_Gui_0

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

    Func _CreateChild(ByRef $_hWnd)
    $_hWnd = GUICreate('', 254, 130, 70, 60, 0x80000000, 0x00000040, $Gui0) ; WS_POPUP = 0x80000000, WS_EX_MDICHILD = 0x00000040
    GUISetBkColor(0x06A533, $_hWnd)
    EndFunc ;==>_CreateChild

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

    Func _MDown()
    ConsoleWrite("Mausdown" & @CRLF)
    Local $aInfo = GUIGetCursorInfo($Gui0); ohne Parameter wird $_hWnd benutzt, da diese Gui zuletzt verwendet wurde. Alternativ kann man GUISwitch benutzen.
    If Not IsArray($aInfo) Then Return
    If $aInfo[4] = $btStartStop Then
    $TimerStart = TimerInit()
    AdlibRegister('_StartEngine')
    EndIf
    EndFunc ;==>_MDown

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

    Func _MUp()
    ConsoleWrite("Mausup" & @CRLF)
    Local $aInfo = GUIGetCursorInfo($Gui0); ohne Parameter wird $_hWnd benutzt, da diese Gui zuletzt verwendet wurde. Alternativ kann man GUISwitch benutzen.
    If Not IsArray($aInfo) Then Return
    Local $iState = $GUI_SHOW
    If $aInfo[4] = $btStartStop Then
    If $iTime <= 400 And $EngineRun = 1 Then
    If $iSnooze = 0 Then
    $iSnooze = 1
    Else
    $iState = $GUI_HIDE
    $iSnooze = 0
    EndIf
    GUICtrlSetState($lbSnooze, $iState)
    AdlibUnRegister('_StartEngine')
    ElseIf $iTime <= 1500 And $EngineRun = 0 Then
    AdlibUnRegister('_StartEngine')
    EndIf
    EndIf
    EndFunc ;==>_MUp

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

    Func _StartEngine()
    $iTime = TimerDiff($TimerStart)
    Local $iState = $GUI_SHOW, $aTitle[2] = ['Engine OFF','Engine ON']
    If $iTime >= 1500 And $iSnooze = 0 Then
    $EngineRun = Not $EngineRun
    Beep(1700)
    AdlibUnRegister('_StartEngine')
    WinSetTitle($Gui0, '', $aTitle[$EngineRun])
    EndIf
    EndFunc ;==>_StartEngine

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

    Func _close_Gui0()
    Exit
    EndFunc

    [/autoit]

    Das Problem liegt an GUIGetCursorInfo, ohne Parameter wird die zuletzt erstellte GUI als Default gewählt.
    Funzt natürlich auch ohne Parameter, wenn du vorher GUISwitch benutzt ;)