Prüfen ob GUI verlassen wurde

  • Hi,

    ich habe eine GUI die schließen möchte sobald man mit der Maus außerhalb der GUI ist. Jemand eine Idee wie ich das machen könnte?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    Einmal editiert, zuletzt von chip (23. Februar 2010 um 21:54)

  • z.B. so:

    [autoit]

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

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

    $Form1 = GUICreate("Form1", 633, 447, 192, 124)
    GUISetState(@SW_SHOW)

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

    Sleep(2000)

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

    While 1
    $Msg = GUIGetMsg()
    $test = GUIGetCursorInfo ( )
    If $test[0] < 0 Or $test[1] < 0 Or $test[0] > 633 Or $test[1] > 447 Then
    MsgBox(0,"!","Fenster wurde verlassen!")
    EndIf
    Switch $Msg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

    [/autoit]
    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Mausposition mit position der gui vergleichen ?
    Ist naheliegend oder ?

    mfg Ubuntu

    Edit: zu spät :pinch:
    und Cartans Lösung ist sogar noch besser. Hut ab ;)

  • Cartan12 GUIGetCursorInfo geht bei GUI nicht

    @Ubuntu habs erstmal so gemacht mit MousGetPOs, dachte aber vielleicht hat noch jemand andere Idee.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • GUIGetCursorInfo geht bei GUI nicht

    Sorry, aber den Satz hab ich jetzt nicht so ganz verstanden
    GUIGetCursorInfo soll bei keiner GUI gehen ?(
    Mein Beispiel klappt bei mir...

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Cartan12 GUIGetCursorInfo geht bei GUI nicht

    @Ubuntu habs erstmal so gemacht mit MousGetPOs, dachte aber vielleicht hat noch jemand andere Idee.


    So sollte es funktionieren:

    Spoiler anzeigen
    [autoit]

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

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

    $Form1 = GUICreate("Form1", 633, 447, 192, 124)
    GUISetState(@SW_SHOW)

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

    Sleep(2000)

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

    While 1
    $Msg = GUIGetMsg()
    $test = GUIGetCursorInfo ( )
    If @error Then
    MsgBox(0, '', "Fenster inaktiv!")
    WinActivate($Form1)
    ElseIf $test[0] < 0 Or $test[1] < 0 Or $test[0] > 633 Or $test[1] > 447 Then
    MsgBox(0,"!","Fenster wurde verlassen!")
    EndIf
    Switch $Msg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

    [/autoit]
  • Ach ja, hab vergessen, dass die GUI aktiv sein muss...

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

    • Offizieller Beitrag

    Hier noch eine Version mit Maus-Positions-Abfrage:

    Spoiler anzeigen
    [autoit]


    $hGui = GUICreate('Test', 600, 600)
    GUISetState(@SW_SHOW, $hGui)
    HotKeySet('!s', '_Show') ; [ALT] + [s] um das Fenster wieder anzuzeigen
    MouseMove(@DesktopWidth / 2, @DesktopHeight / 2, 0) ; Maus in der Mitte positionieren
    Do
    $aMousePos = MouseGetPos()
    $aWinPos = WinGetPos($hGui)
    If $aMousePos[0] < $aWinPos[0] Or $aMousePos[0] > ($aWinPos[0] + $aWinPos[2]) _
    Or $aMousePos[1] < $aWinPos[1] Or $aMousePos[1] > ($aWinPos[1] + $aWinPos[3]) Then GUISetState(@SW_HIDE, $hGui)
    Until GUIGetMsg() = -3

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

    Func _Show()
    MouseMove(@DesktopWidth / 2, @DesktopHeight / 2, 0)
    GUISetState(@SW_SHOW, $hGui)
    EndFunc

    [/autoit]
  • Ich habs nun so realisiert:

    [autoit]


    While 1
    $pos = MouseGetPos()
    If $pos[0] > 252 Or $pos[1] < @DesktopHeight - 532 Then
    GUISetState(@SW_HIDE, $Startmenu)
    ExitLoop
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Fürs nächste mal geht auch das hier:

    [autoit]

    Func _CheckForWinHover($hWnd)
    Local $aResult, $aWPos = WinGetPos($hWnd), $aMPos = MouseGetPos()
    Local $tRect = DllStructCreate("int Left;int Top;int Right;int Bottom")
    Local $iLeft = $aWPos[0], $iTop = $aWPos[1], $iWidth = $aWPos[2], $iHeight = $aWPos[3]
    Local $iX = $aMPos[0], $iY = $aMPos[1]
    DllStructSetData($tRect, "Left", $iLeft)
    DllStructSetData($tRect, "Top", $iTop)
    DllStructSetData($tRect, "Right", $iLeft + $iWidth)
    DllStructSetData($tRect, "Bottom", $iTop + $iHeight)

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

    $aResult = DllCall("User32.dll", "int", "PtInRect", "ptr", DllStructGetPtr($tRect), "int", $iX, "int", $iY)
    If @error Then Return SetError(@error, 0, False)

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

    Return $aResult[0] <> 0
    EndFunc ;==>_CheckForWinHover

    [/autoit]