#NoTrayIcon ; Kein unnötiges Tray Icon für den "ErrorHandler" anzeigen
#include <EditConstants.au3> ; Wird für die GUI benötigt, kann bei anderer GUI evtl. entfernt werden.
FileChangeDir (@ScriptDir)
If @Compiled Then ; Liegt das Programm als kompilierte Version (als EXE) vor?
$pfad = @ScriptDir & "\Programm.exe" ; Wenn JA, das Hauptprogramm "Programm.exe" mit dem Parameter "-Dihydrogenmonoxid-" starten.
$iPID=Run("Programm.exe" & ' /ErrorStdOut -Dihydrogenmonoxid-',"",Default,6)
Else
$pfad = @ScriptDir & "\Programm.au3" ; Wenn NEIN, das Hauptscript "Programm.au3" mit dem Parameter "-Dihydrogenmonoxid-" über den AutoIt Interpreter starten.
$iPID=Run(@AutoItExe & ' /ErrorStdOut "'&$pfad&'" -Dihydrogenmonoxid-',"",Default,6)
EndIf
; Der Parameter /ErrorStdOut sorgt dafür, dass die Fehlermeldung nicht als MsgBox ausgegeben, sondern an den STDOUT Stream weitergegeben wird, den der "ErrorHandler" laufen überwacht.
; Hierzu aus der AutoIt Hilfe:
; The AutoIt3.exe interpreter, or the interpreter stub of any compiled Autoit script, can normally be used to run AutoIt scripts directly from the command line.
; In all cases the /ErrorStdOut switch allows the redirection of a fatal error to StdOut which can then be captured by an application such as the SciTE editor. This switch can be used with
; both the interpreter and a compiled script.
$sErrorMsg = ""
ProcessWait($iPID) ; Warten, bis das Hauptprogramm auch wirklich läuft
While 1 ; Laufend überprüfen, ob das Hauptprogramm etwas in den STDOUT Stream schreibt und diese Daten sammeln.
$sErrorMsg&=StdoutRead($iPID)
If @error Then ExitLoop ; Wenn der Prozess des Hauptprogramms nicht mehr existiert (da abgestürzt oder beendet) die Schleife verlassen.
Sleep(10)
WEnd
If $sErrorMsg = "" Then Exit ; Wenn keine Daten gesammelt wurden (es wurde also keine Fehlermeldung ausgegeben und das Programm normal beendet), ebenfalls den "ErrorHandler" beenden.
; Wurde jedoch eine Fehlermeldung ausgegeben, wird diese im Folgenden in einer GUI ausgegeben.
; Im Folgenden wird die GUI angezeigt. Die GUI kann natürlich beliebig angepasst werden, hier sind der Kreativität keine Grenzen gesetzt.
; Wichtig ist jedoch: Alles sollte 100 prozentig fehlerfrei programmiert sein! Ein Absturz des "ErrorHandlers" wird nämlich nicht abgefangen und wäre mehr als peinlich 
Dim $text[5]
$text[0]="Das Programm ist nach einem schweren Fehler abgestürzt:"
$text[1]="Fehlerbericht senden"
$text[2]="Neu starten"
$text[3]="Beenden"
$text[4]="Bitte beschreibe hier, was du vor dem Programmabsturz getan hast."
$GUI = GUICreate("Fehler", 419, 192,-1,-1,-1)
GUISetBkColor(0xFFFFFF)
$Label1 = GUICtrlCreateLabel("Houston, we’ve had a problem.", 8, 3, 364, 25)
GUICtrlSetFont(-1, 12, 400, 0, "Arial Black")
GUICtrlSetColor(-1, 0xF77F00)
GUICtrlCreateLabel($text[0], 8, 28, 311, 17)
$send = GUICtrlCreateButton($text[1], 8, 158, 131, 25)
$restart = GUICtrlCreateButton($text[2], 144, 158, 131, 25)
$exit = GUICtrlCreateButton($text[3], 280, 158, 131, 25)
GUICtrlCreateEdit("", 8, 50, 401, 100,BitOR ($ES_READONLY,$GUI_SS_DEFAULT_EDIT))
$sErrorMsg = $sErrorMsg&@CRLF & @OSVersion & " " & @OSServicePack & " "&@OSArch ; Fehlermldung um Daten zum Betriebssystem erweitern
GUICtrlSetData(-1, $sErrorMsg)
GUISetState(@SW_SHOW)
WinSetOnTop ($GUI,"",1) ; GUI in den Vordergrund
; X-Symbol in der GUI deaktivieren
Dim Const $SC_CLOSE = 0xF060
$dSysMenu = DllCall("User32.dll", "hwnd", "GetSystemMenu", "hwnd", $GUI, "int", 0)
$hSysMenu = $dSysMenu[0]
DllCall("User32.dll", "int", "RemoveMenu", "hwnd", $hSysMenu, "int", $SC_CLOSE, "int", 0)
DllCall("User32.dll", "int", "DrawMenuBar", "hwnd", $GUI)
DllCall ("user32.dll", "int", "MessageBeep", "int", 0x00000010) ; Ton ausgeben
While 1 ; Eingaben des Nutzers in der GUI abfragen
$nMsg = GUIGetMsg()
Switch $nMsg
Case $exit
Exit
Case $send
MsgBox (0,"","Programmiere mich :)",0,$GUI)
Case $restart
ShellExecute (@AutoItExe,'"'&@ScriptFullPath&'"')
Exit
EndSwitch
WEnd