Programmabstürze monitoren?

  • Hallo, ich habe mal folgende Frage. Ich habe unten stehendes kleines Autoit Script geschrieben, mit dem ich Telefonnummern so umbaue, das ich sie in Lync sauber verwenden kann. Das ganze geht recht einfach, d.h. ich markiere die "komische" Telefonnummer, drücke F3 zum Einlesen und umbauen und F4 um es in Lync reinzukopieren und gleich loswählen lassen.

    Es kommt aber pro Tag ca. 2 bis 3 mal vor, das sich die EXE einfach beendet, ohne irgendeine Fehlermeldung. Ich merke das halt nur daran, das meine F3 und F4 Tasten plötzlich nicht mehr gehen. Mein Trayicon ist eigentlich auch noch sichtbar, sobald ich jedoch mit der Maus über das Trayicon fahre, verschwindet es.

    Was kann ich hier denn machen, damit ich solche Abstürze mitbekomme und was kann man dann dagegen machen?

    Hier mal der Code:

    Spoiler anzeigen
    [autoit]

    #include <TrayConstants.au3>

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

    HotKeySet("{F3}", "_WritePhoneNumbr")
    HotKeySet("{F4}", "_Copy2Lync")

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

    ;Tray-Menü anpassen
    Opt("TrayAutoPause", 0) ; Script will not be paused when clicking the tray icon.
    Opt("TrayOnEventMode", 1)
    Opt("TrayMenuMode", 1 + 2)
    $Version = "1.0.3"

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

    $versionitem = TrayCreateItem("Version: " & $Version)
    TrayItemSetState(-1, $TRAY_UNCHECKED)
    $exititem = TrayCreateItem("Beenden")
    TrayItemSetState(-1, $TRAY_UNCHECKED)
    TrayItemSetOnEvent(-1, "_Exit")
    TraySetState()

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

    Global $Input, $Output, $_sNumber, $_sNumber1, $_sNumber2, $_sNumber3, $_sNumber4, $_sNumber5, $_sNumber6, $iLength, $shostname

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

    While 1
    Sleep(100)
    WEnd

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

    Func _WritePhoneNumbr(); F3
    $Input = ClipPut(""); Zwischenablage leeren
    Send("^c"); Markierter Text wird in die Zwischenablage geschrieben
    $Input = ClipGet(); Zwischenablage wird in die Variable $Input ausgelesen
    If $Input = "" Then
    MsgBox(16, "STOP", "Es wurde keine Rufnummer in der Zwischenablage gefunden." & @CRLF & @CRLF & "Bitte wiederholen!", 3)
    Else
    $_sNumber = StringRegExpReplace($Input, '\(0\)', '', 1); Das erste Vorkommen von (0) wird gelöscht
    ;~ ConsoleWrite("1: " & $_sNumber & @CRLF)
    $_sNumber2 = StringRegExpReplace($_sNumber, '(-|\s|\(|\)|/|\\|–|\.)', ''); Entferne - | s | ( | ) | / | \ –
    ;~ ConsoleWrite("2: " & $_sNumber2 & @CRLF)
    $_sNumber3 = StringRegExpReplace($_sNumber2, '(\+49|049)', ''); Ersetze ein +49 oder 049 mit Leerzeichen
    ;~ ConsoleWrite("3: " & $_sNumber3 & @CRLF)
    $iLength = StringLen($_sNumber3); Bestimme die Länge des Strings
    ;~ ConsoleWrite("4: Länge = " & $iLength & @CRLF)
    If $iLength > 3 Then; Wenn der String größer 3 ist dann, gehe in die IF Schleife
    $_sNumber4 = StringLeft($_sNumber3, 1); Prüfe das 1. Zeichen von Links
    If $_sNumber4 = "0" Then; Wenn das erste Zeichen von Links eine Null ist, gehe in die IF Schleife
    ;~ ConsoleWrite("5: If ist wahr, also 0 dann: " & $_sNumber4 & @CRLF)
    $_sNumber5 = StringRegExpReplace($_sNumber3, '0', '', 1); Wenn die erste Ziffer eine Null ist, dann durch ein Leerzeichen ersetzen
    ;~ ConsoleWrite("6: " & $_sNumber5 & @CRLF)
    $_sNumber6 = ("+49" & $_sNumber5); Setze + 49 vor die Nummer
    ;~ ConsoleWrite("7: " & $_sNumber6 & @CRLF)
    Else
    ;~ ConsoleWrite("5: If ist unwahr, also nicht 0 dann: " & $_sNumber4 & @CRLF)
    ;~ ConsoleWrite("6: " & $_sNumber3 & @CRLF)
    $_sNumber6 = ("+49" & $_sNumber3); Setze + 49 vor die Nummer
    ;~ ConsoleWrite("7: " & $_sNumber6 & @CRLF)
    EndIf
    $Output = ClipPut($_sNumber6); schreibe das Ergebnis in die Zwischenablage zurück
    Else
    $Output = ClipPut($_sNumber3); schreibe das Ergebnis in die Zwischenablage zurück
    EndIf
    EndIf

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

    EndFunc ;==>_WritePhoneNumbr

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

    Func _Copy2Lync(); F4
    Send("^a"); Strg + a = alles markieren
    Send("{DELETE}"); Vorhandene Nummer wird gelöscht
    Send("^v"); Markierter Text wird aus der Zwischenablage geschrieben
    If $shostname = "DE00-FM230-L" Then; PC mit Lync Attandant 2010
    Send("{ENTER 2}"); Einfügen und Enter zum wählen
    Else; andere PCs mit Lync 2013
    Sleep(1000)
    Send("{ENTER}"); Einfügen und Enter zum wählen
    ;~ ConsoleWrite("MOLE")
    EndIf
    EndFunc ;==>_Copy2Lync

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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

    Danke für eure Hilfe

  • So, hier mal mein neues Zwischenergebnis.

    Wenn ich das Script von Hand beende, bekomme ich die Messagebox mit der Wert "1" dargestellt, d.h. das Script wird "offiziell" beendet.
    Heute ist mir das Script jetzt schon zum 2. mal abgeschmiert, jedoch wird hier KEINE Messagebox angezeigt, somit auch kein Fehlercode :(

  • Hallo Oscar,

    die "komischen" Telefonnummern stehen ja nicht immer in einer fixen Anwendung. Mal kommen die aus Lotus Notes, mal aus Outlook, mal aus dem Internet usw...
    Von daher sollte ich möglichst offen bleiben. Ich muss die "komische" Telefonnummer auf jeden Fall mit der Maus markieren. Wenn man danach was anderes machen kann, würde ich es versuchen zu optimieren, aber dazu brauche ich ein paar Stichworte. Der ControlClick wäre hier viel zu kompliziert, weil Lync hier alles unnötig weiter versteckt.

    Wie gesagt, das ganze ist ja auch kein Beinbruch, wenn ich es nicht hinbekomme. Dann starte ich die Anwendung halt 2x am Tag, aber interessieren würde es mich schon, warum das Teil wegschmiert, bzw. wie man so einen Fehler abfangen kann.

    • Offizieller Beitrag

    Man könnte auch die Zwischenablage überwachen, dann könnte man eine beliebige Telefonnummer markieren und mit [STRG] & [c] kopieren und das Script konvertiert die Telefonnummer und legt sie wieder in die Zwischenablage, zum einfügen in das Wählprogramm:

    Spoiler anzeigen
    [autoit]


    #include <GuiConstantsEx.au3>
    #include <ClipBoard.au3>
    #include <WindowsConstants.au3>
    #include <SendMessage.au3>

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

    $hGui = GUICreate('ClipboardViewer', 300, 400, @DesktopWidth - 316, 40, BitOR($WS_CAPTION, $WS_POPUPWINDOW, $WS_SIZEBOX))
    $idClipMemo = GUICtrlCreateEdit('', 0, 0, 300, 400, $WS_VSCROLL)
    GUICtrlSetFont(-1, 10, 400, 0, 'Courier New')
    GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
    GUISetState()
    WinSetOnTop($hGui, '', 1)
    $hNext = _ClipBoard_SetViewer($hGui)
    GUIRegisterMsg($WM_CHANGECBCHAIN, 'WM_CHANGECBCHAIN')
    GUIRegisterMsg($WM_DRAWCLIPBOARD, 'WM_DRAWCLIPBOARD')
    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    _ClipBoard_ChangeChain($hGui, $hNext)
    Exit
    EndSwitch
    WEnd

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

    Func WM_CHANGECBCHAIN($hWnd, $iMsg, $iwParam, $ilParam)
    If $iwParam = $hNext Then
    $hNext = $ilParam
    ElseIf $hNext <> 0 Then
    _SendMessage($hNext, $WM_CHANGECBCHAIN, $iwParam, $ilParam, 0, 'hwnd', 'hwnd')
    EndIf
    EndFunc ;==>WM_CHANGECBCHAIN

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

    Func WM_DRAWCLIPBOARD($hWnd, $iMsg, $iwParam, $ilParam)
    Local $sClipBoard = _ClipBoard_GetData()
    Local $_sNumber, $_sNumber2, $_sNumber3, $_sNumber4, $_sNumber5, $_sNumber6
    Local $_sNumber = StringRegExpReplace($sClipBoard, '\(0\)', '', 1); Das erste Vorkommen von (0) wird gelöscht
    ConsoleWrite("1: " & $_sNumber & @CRLF)
    $_sNumber2 = StringRegExpReplace($_sNumber, '(-|\s|\(|\)|/|\\|–|\.)', ''); Entferne - | s | ( | ) | / | \ –
    ConsoleWrite("2: " & $_sNumber2 & @CRLF)
    $_sNumber3 = StringRegExpReplace($_sNumber2, '(\+49|049)', ''); Ersetze ein +49 oder 049 mit Leerzeichen
    ConsoleWrite("3: " & $_sNumber3 & @CRLF)
    $iLength = StringLen($_sNumber3); Bestimme die Länge des Strings
    ConsoleWrite("4: Länge = " & $iLength & @CRLF)
    If $iLength > 3 Then; Wenn der String größer 3 ist dann, gehe in die IF Schleife
    $_sNumber4 = StringLeft($_sNumber3, 1); Prüfe das 1. Zeichen von Links
    If $_sNumber4 = "0" Then; Wenn das erste Zeichen von Links eine Null ist, gehe in die IF Schleife
    ConsoleWrite("5: If ist wahr, also 0 dann: " & $_sNumber4 & @CRLF)
    $_sNumber5 = StringRegExpReplace($_sNumber3, '0', '', 1); Wenn die erste Ziffer eine Null ist, dann durch ein Leerzeichen ersetzen
    ConsoleWrite("6: " & $_sNumber5 & @CRLF)
    $_sNumber6 = ("+49" & $_sNumber5); Setze + 49 vor die Nummer
    ConsoleWrite("7: " & $_sNumber6 & @CRLF)
    Else
    ConsoleWrite("5: If ist unwahr, also nicht 0 dann: " & $_sNumber4 & @CRLF)
    ConsoleWrite("6: " & $_sNumber3 & @CRLF)
    $_sNumber6 = ("+49" & $_sNumber3); Setze + 49 vor die Nummer
    ConsoleWrite("7: " & $_sNumber6 & @CRLF)
    EndIf
    ClipPut($_sNumber6); schreibe das Ergebnis in die Zwischenablage zurück
    EndIf
    GUICtrlSetData($idClipMemo, $_sNumber6 & @CRLF, 1)
    If $hNext <> 0 Then _SendMessage($hNext, $WM_DRAWCLIPBOARD, $iwParam, $ilParam)
    EndFunc ;==>WM_DRAWCLIPBOARD

    [/autoit]

    P.S.: Es gibt keine If-Schleifen! Es handelt sich dabei um bedingte Anweisungen. :)