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?
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?
Die 2 Fallen mir spontan ein. WIe das über den Taskmanager erkannt werden soll weiß ich nicht.
[autoit]TrayGetMsg()
GUIGetMsg()
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:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("TrayMenuMode",1) ; Default tray menu items (Script Paused/Exit) will not be shown.
$trayexit = TrayCreateItem("Mein Programm beenden")
#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 ###
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
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:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("TrayMenuMode", 1) ; Default tray menu items (Script Paused/Exit) will not be shown.
$trayexit = TrayCreateItem("Mein Programm beenden")
#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"
If FileExists($prozesschecker) Then
ShellExecute($prozesschecker, @ScriptName)
Else
MsgBox(0, "", $prozesschecker & " nicht gefunden.")
EndIf
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
Func _exit()
If ProcessExists($prozesschecker) Then ProcessClose($prozesschecker)
Exit
EndFunc ;==>_exit
Prozesschecker exe
#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
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.
If $CmdLine[0] = 0 Then Exit
While ProcessExists($CmdLine[1])
Sleep(50)
WEnd
MsgBox(0, "Error", $CmdLine[1] & " wurde beendet")
Exit
Edit2: (Misterspeeds Optimierungsvorschläge)
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("TrayMenuMode", 1) ; Default tray menu items (Script Paused/Exit) will not be shown.
$trayexit = TrayCreateItem("Mein Programm beenden")
#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"
If FileExists($prozesschecker) Then
$PID_checker = Run($prozesschecker & " " & @AutoItPID)
;ShellExecute($prozesschecker, @ScriptName)
Else
MsgBox(0, "", $prozesschecker & " nicht gefunden.")
EndIf
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
Func _exit()
If ProcessExists($PID_checker) Then ProcessClose($PID_checker)
Exit
EndFunc ;==>_exit
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.