Beendenoptionen beim Prozess, etc.?

  • Hallo,

    ich würde gerne einmal wissen, welche Befehle ich benötige um zu bestimmen, was passiert, wenn das Programm beendet wurde, durch

    - GUI schließen
    - Schließen über Tray
    - Schließen über Taskmanager < Überhaupt möglich?

  • Das beenden per Taskmanager kann man wohl nur daran erkennen wenn man beim normalen beenden z.B. in eine Logdatei schreibt, dass das Programm ordnungsgemäß beendet wurde und dies beim nächsten Start prüft. Auf ein Beenden per Taskmanager kann man also bestenfalls beim nächsten Programmstart reagieren.

    Der Rest ist kein Problem:

    Spoiler anzeigen
    [autoit]

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

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

    Opt("TrayMenuMode",1) ; Default tray menu items (Script Paused/Exit) will not be shown.
    $trayexit = TrayCreateItem("Mein Programm beenden")

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 625, 445, 192, 124)
    $Button1 = GUICtrlCreateButton("exit", 176, 144, 75, 25, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    MsgBox(0,"","exit by X")
    Exit
    Case $Button1
    MsgBox(0,"","exit by Button")
    Exit
    EndSwitch
    if TrayGetMsg()=$trayexit Then
    MsgBox(0,"","exit by Tray")
    Exit
    EndIf
    WEnd

    [/autoit]
  • Ich habe ein Workaround gebastelt. Allerdings braucht man dafür dann eine 2 Exe die, die erste überwacht.

    Beide Scripte MÜSSEN kompiliert werden.

    Programm exe:

    Spoiler anzeigen
    [autoit]

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

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

    Opt("TrayMenuMode", 1) ; Default tray menu items (Script Paused/Exit) will not be shown.
    $trayexit = TrayCreateItem("Mein Programm beenden")

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

    #region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 625, 445, 192, 124)
    $Button1 = GUICtrlCreateButton("exit", 176, 144, 75, 25, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###
    $prozesschecker = "Prozesschecker.exe"

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

    If FileExists($prozesschecker) Then
    ShellExecute($prozesschecker, @ScriptName)
    Else
    MsgBox(0, "", $prozesschecker & " nicht gefunden.")
    EndIf

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    MsgBox(0, "", "exit by X")
    _exit()
    Case $Button1
    MsgBox(0, "", "exit by Button")
    _exit()
    EndSwitch
    If TrayGetMsg() = $trayexit Then
    MsgBox(0, "", "exit by Tray")
    _exit()
    EndIf
    WEnd

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

    Func _exit()
    If ProcessExists($prozesschecker) Then ProcessClose($prozesschecker)
    Exit
    EndFunc ;==>_exit

    [/autoit]

    Prozesschecker exe

    Spoiler anzeigen
    [autoit]

    #region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
    #endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
    If $CmdLine[0] = 0 Then Exit
    While 1
    If ProcessExists($CmdLine[1]) Then
    Sleep(50)
    Else
    MsgBox(0, "Error", $CmdLine[1] & " wurde beendet")
    Exit
    EndIf
    WEnd

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

    So kann man zwar auch nicht genau sagen ob es der Taskmanager oder ein Programmabsturz war. Aber du kannst bedingt reagieren.

    Edit:
    Noch ein wenig kürzerer code für den Checker.

    Spoiler anzeigen
    [autoit]

    If $CmdLine[0] = 0 Then Exit
    While ProcessExists($CmdLine[1])
    Sleep(50)
    WEnd
    MsgBox(0, "Error", $CmdLine[1] & " wurde beendet")
    Exit

    [/autoit]

    Edit2: (Misterspeeds Optimierungsvorschläge)

    Spoiler anzeigen
    [autoit]

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

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

    Opt("TrayMenuMode", 1) ; Default tray menu items (Script Paused/Exit) will not be shown.
    $trayexit = TrayCreateItem("Mein Programm beenden")

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

    #region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 625, 445, 192, 124)
    $Button1 = GUICtrlCreateButton("exit", 176, 144, 75, 25, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###
    $prozesschecker = "Prozesschecker.exe"

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

    If FileExists($prozesschecker) Then
    $PID_checker = Run($prozesschecker & " " & @AutoItPID)
    ;ShellExecute($prozesschecker, @ScriptName)
    Else
    MsgBox(0, "", $prozesschecker & " nicht gefunden.")
    EndIf

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    MsgBox(0, "", "exit by X")
    _exit()
    Exit
    Case $Button1
    MsgBox(0, "", "exit by Button")
    _exit()
    EndSwitch
    If TrayGetMsg() = $trayexit Then
    MsgBox(0, "", "exit by Tray")
    _exit()
    EndIf
    WEnd

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

    Func _exit()
    If ProcessExists($PID_checker) Then ProcessClose($PID_checker)
    Exit
    EndFunc ;==>_exit

    [/autoit]
  • Jupp ebenfalls ein Weg, jedoch würde ich anstelle von @scriptname eher @AutoItPID verwenden, da dies eindeutig ist und nicht mit gleichnamigen Programmen oder Instanzen des Programms kollidiert.
    Das selbe gilt auch für die Prüfung im Hauptprogramm, auch hier sollte eher run benutzt werden damit man den CheckerProzess dann anhand der PID prüfen und beenden kann statt anhand des Prozess Namens.

    2 Mal editiert, zuletzt von misterspeed (5. Februar 2012 um 15:22)