Unterfunktion springt nicht sauber raus

  • Guten Morgen,

    die Überschrift ist vermutlich alles andere als glücklich gewählt, aber ich kenne nicht die Fachbegriffe und versuche mein Problem mal zu umschreiben
    Ich habe ja vor längerer Zeit begonnen ein kleine Überwachungssoftware für unser Kind zu schreiben. Das läuft soweit auch alles OK.
    Dann wollte ich mal eine "Abbruchfunktion" haben, welche wir hier gelöst haben.

    Ach zur Erklärung. Das kleine Progi macht nur folgendes. In der Schulzeit / Ferienzeit darf unser Kind in einem von uns Eltern vorgegebenen Zeitraum selbstständig an den Computer. Je nachdem ob zur Zeit Schule oder Ferien sind, kann es dann z.B. 30 oder 60 Minuten an den PC. Nach Ablauf dieser Zeit fährt der PC selbstständig runter.

    Die obige Lösung wollte ich als "Abbruchfunktion" für mich, d.h. wenn die Anwendung vor Ablauf der Zeit beendet wird, fährt der PC auch runter. Diese Abbruchfunktion geht super, jedoch wird danach ja auch die Hauptanwendung beendet.

    In der Hauptanwendung habe ich im Menü ein "Ende" und einen "Administration" Menü. Beim Aufruf der Funktion (_KCLAdmin) "Administration" kann man entscheiden ob gerade Schule oder Ferien sind, bzw. kann die tägliche Minutenanzahl von uns Eltern individuell bestimmt werden. Auch das geht alles wunderbar.

    Jetzt zu meinem Problem.

    Auf Basis der obigen Lösung, wollte ich das auch mit der "F9" Taste so einbauen, das wenn die Zeit eigentlich abgelaufen ist, man mit "F9" nochmals in Administrationsmenü kommt, um dem Kind vielleicht doch nochmal ein paar Minuten zu geben. Das "hatte" ich auch hinbekommen, aber nachdem dann die "neue" Zeit sichtbar war, scheint das Programm nicht mehr - ich nenne es mal Hauptschleife - zu sein. Die Uhrzeit zählt zwar runter, aber die Menüpunkte "Ende" "Administration", bzw. die Anwenudung via "X" beenden oder auch über eine separate Schaltfläche "Ich mach jetzt Schluss" funktionieren dann nicht mehr. Konnte die Anwendung nur noch über den Taskmanager killen.

    Anbei mal ein wenig Code

    Spoiler anzeigen
    [autoit]

    Func _KCLStopmodus(); PC wird runtergefahren
    MsgBox(0, "Stop", "Dein Computer schaltet sich in 15 Sekunden automatisch ab" & @CRLF & @CRLF & "Tschüss " & $var_Benutzername, 15)
    Local $hDLL = DllOpen("user32.dll")
    Local $begin = TimerInit()
    While 1
    If TimerDiff($begin) < 5000 Then
    If _IsPressed("79", $hDLL) Then ; 79 ist die F10 Taste
    DllClose($hDLL)
    Exit; KCL wird beendet, PC bleibt an
    EndIf

    ;==> hier soll der Teil mit der "F9" Taste rein, damit die Adminfunktion aufgerufen wird, aber die Hauptanwendung danach sauber weiter läuft

    Else
    Shutdown(13)
    Exit
    EndIf
    WEnd
    EndFunc ;==>_KCLStopmodus

    [/autoit]

    und hier die Adminfunktion

    Spoiler anzeigen
    [autoit]

    Func _KCLAdmin(); eine eigene Admin GUI, wo der Ferienmodus aktiv oder deaktiv gesetzt werden kann, sowie Bonus Minuten vergeben werden können
    Local $nMsg2, $var_inifile_modus
    #region ### START Koda GUI section ### Form=
    $GUI_Admin = GUICreate("Kids Control Light - Administration", 451, 244, 513, 401)
    GUISetBkColor(0xFFCCFF)

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

    $GUI_Admin_Label01 = GUICtrlCreateLabel("Administrationsbereich", 88, 16, 249, 33)
    GUICtrlSetFont(-1, 18, 400, 0, "MS Sans Serif")
    GUICtrlSetColor(-1, 0x0000FF)

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

    $var_inifile_lesen = _KCLIniLesen($var_inifile, $var_Benutzername, "Modus"); Lese den aktuellen Modus aus dem ini file
    $var_inifile_modus = $var_inifile_lesen; schreibe die globale Variablen Zeit in eine individuelle Variable
    ConsoleWrite("Modus ist: " & $var_inifile_modus & @CRLF)

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

    If $var_inifile_modus = 1 Then ; Ferien
    $GUI_Admin_Button01 = GUICtrlCreateButton("Ferienmodus aktiv :-)", 16, 64, 250, 49)
    GUICtrlSetFont(-1, 16, 800, 0, "MS Sans Serif")
    GUICtrlSetColor(-1, 0x008000)
    GUICtrlSetBkColor(-1, 0x00FF00)
    Local $var_checkbox01 = GUICtrlCreateCheckbox("", 300, 65, 40, 40)
    GUICtrlSetState($var_checkbox01, $gui_checked)
    GUISetState(@SW_SHOW)

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

    Else ; Schule
    $GUI_Admin_Button01 = GUICtrlCreateButton("Schulmodus aktiv :-(", 16, 64, 250, 49)
    GUICtrlSetFont(-1, 16, 800, 0, "MS Sans Serif")
    GUICtrlSetColor(-1, 0x663366)
    GUICtrlSetBkColor(-1, 0xFF00FF)
    Local $var_checkbox01 = GUICtrlCreateCheckbox("", 300, 65, 40, 40)
    GUICtrlSetState($var_checkbox01, $gui_unchecked)
    GUISetState(@SW_SHOW)
    EndIf

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

    $GUI_Admin_Label02 = GUICtrlCreateLabel("Heute noch", 16, 136, 126, 33)
    GUICtrlSetFont(-1, 18, 400, 0, "MS Sans Serif")
    GUICtrlSetColor(-1, 0x0000FF)

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

    $var_inifile_lesen = _KCLIniLesen($var_inifile, $var_Benutzername, "Kontingent"); Lese das aktuelle Kontingent aus dem ini file
    $var_inifile_Kontingent = $var_inifile_lesen; schreibe die globale Variablen Zeit in eine individuelle Variable
    ;ToolTip ("noch " & $var_inifile_Kontingent & " Minuten", @DesktopWidth - (@DesktopWidth - 5), @DesktopHeight - (@DesktopHeight - 5), "lala", 1, 7)
    If $var_inifile_Kontingent = -1 Then
    Local $var_Kontingent = 0
    Else
    Local $var_Kontingent = $var_inifile_Kontingent
    EndIf
    $GUI_Admin_Input01 = GUICtrlCreateInput($var_Kontingent, 176, 136, 89, 37)
    GUICtrlSetFont(-1, 18, 800, 0, "MS Sans Serif")
    GUICtrlSetColor(-1, 0x00FF00)

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

    $GUI_Admin_Label03 = GUICtrlCreateLabel("Minuten übrig", 280, 136, 150, 33)
    GUICtrlSetFont(-1, 18, 400, 0, "MS Sans Serif")
    GUICtrlSetColor(-1, 0x0000FF)

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

    $GUI_Admin_Button02 = GUICtrlCreateButton("Speichern && Beenden", 16, 192, 169, 41)

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

    $GUI_Admin_Button03 = GUICtrlCreateButton("Abbrechen", 264, 192, 169, 41)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

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

    While 2
    $nMsg2 = GUIGetMsg()
    Switch $nMsg2
    Case $GUI_EVENT_CLOSE
    GUIDelete($GUI_Admin)
    ExitLoop

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

    Case $GUI_Admin_Button03
    GUIDelete($GUI_Admin)
    ExitLoop

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

    Case $GUI_Admin_Button02
    Local $var_Kontingent_aus_Intput01 = GUICtrlRead($GUI_Admin_Input01)
    ConsoleWrite($var_Kontingent_aus_Intput01 & @CRLF)
    _KCLIniSchreiben($var_inifile, $var_Benutzername, "Kontingent", $var_Kontingent_aus_Intput01 - 1)

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

    $var_inifile_lesen = _KCLIniLesen($var_inifile, $var_Benutzername, "Wochentag"); Lese die aktuelle Zeit aus dem ini file
    $var_inifile_Wochentag = $var_inifile_lesen; schreibe die globale Variablen Zeit in eine individuelle Variable

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

    If GUICtrlRead($var_checkbox01) = $gui_checked Then; es sind Ferien
    $var_inifile_modus = 1
    GUICtrlSetData($GUI_Group_Info_Text, "Hallo " & $var_Benutzername & ", heute ist " & $var_inifile_Wochentag & ", es ist jetzt " & $var_inifile_Zeit & " Uhr, und Du kannst heute noch " & $var_Kontingent_aus_Intput01 & " Minuten am Computer verbringen." & @CRLF & @CRLF & "Es sind gerade Ferien, das heißt Du kannst zwischen " & $var_TagesStart & " und " & $var_TagesEnde & " Uhr an den Computer"); Beschreibungstext
    Else
    $var_inifile_modus = 0 ; es sind keine Ferien
    GUICtrlSetData($GUI_Group_Info_Text, "Hallo " & $var_Benutzername & ", heute ist " & $var_inifile_Wochentag & ", es ist jetzt " & $var_inifile_Zeit & " Uhr, und Du kannst heute noch " & $var_Kontingent_aus_Intput01 & " Minuten am Computer verbringen." & @CRLF & @CRLF & "Es ist gerade Schulzeit, das heißt Du kannst zwischen " & $var_TagesStart & " und " & $var_TagesEnde & " Uhr an den Computer"); Beschreibungstext
    EndIf
    _KCLIniSchreiben($var_inifile, $var_Benutzername, "Modus", $var_inifile_modus)
    GUICtrlSetBkColor($GUI_Group_Info_Text, 0x700FF00); Hintergrundfarbe grün, d.h. innerhalb der Onlinezeiten
    GUISetBkColor(0x00FF00, $Form1); Hintergrundfarbe der Grund GUI (grün)
    GUISetState(); GUI wird aktualisiert
    GUIDelete($GUI_Admin)
    ExitLoop

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

    Case $var_checkbox01
    If GUICtrlRead($var_checkbox01) = $gui_checked Then
    GUICtrlSetData($GUI_Admin_Button01, "Ferienmodus aktiv :-)")
    GUICtrlSetFont($GUI_Admin_Button01, 16, 800, 0, "MS Sans Serif")
    GUICtrlSetColor($GUI_Admin_Button01, 0x008000)
    GUICtrlSetBkColor($GUI_Admin_Button01, 0x00FF00)
    GUISetState(@SW_SHOW)

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

    Else
    GUICtrlSetData($GUI_Admin_Button01, "Schulmodus aktiv :-(")
    GUICtrlSetFont($GUI_Admin_Button01, 16, 800, 0, "MS Sans Serif")
    GUICtrlSetColor($GUI_Admin_Button01, 0x663366)
    GUICtrlSetBkColor($GUI_Admin_Button01, 0xFF0000)
    GUISetState(@SW_SHOW)
    EndIf
    EndSwitch
    WEnd
    EndFunc ;==>_KCLAdmin

    [/autoit]

    Kann mir hier jemand ein wenig behilflich sein (ein paar Codeschnipsel wären schön), wie ich die _KCLAdmin mit "F9" aufrufe (das hatte ich ja selbst noch hinbekommen) und nachdem ich dort auf "Speichern & Beenden" gedrückt habe, wie sauber in der Hauptanwendung bin (das hatte ich nicht hinbekommen)

    Vielleicht mache ich ja auch was mit den While Schleifen falsch. Ich habe in der Funktion _KCLAdmin eine "While 2" drin, weil ich mir nicht sicher bin, ob es mit der "While 1" aus der Hauptanwendung kollidiert.

    vielen Dank für Eure Antworten.

    Gruß Hassan

  • Also ich würde das ganze in _KCLStomodus mit "HotKeySet" machen also so:

    Spoiler anzeigen
    [autoit]

    Func _KCLStopmodus(); PC wird runtergefahren


    HotKeySet("","_KCLAdmin")

    MsgBox(0, "Stop", "Dein Computer schaltet sich in 15 Sekunden automatisch ab" & @CRLF & @CRLF & "Tschüss " & $var_Benutzername, 15)

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

    Local $hDLL = DllOpen("user32.dll")
    Local $begin = TimerInit()
    While 1
    If TimerDiff($begin) < 5000 Then
    If _IsPressed("79", $hDLL) Then ; 79 ist die F10 Taste
    DllClose($hDLL)
    Exit; KCL wird beendet, PC bleibt an
    EndIf

    Else
    Shutdown(13)
    Exit
    EndIf
    WEnd
    EndFunc ;==>_KCLStopmodus

    [/autoit]

    In deiner Adminfunktion sehe ich nicht was die Funktion wieder aufruft welche den Timer startet. Daher kann es nicht funktionieren. Poste mal dein ganze Script so ist da nichts weiter zu erkennen.

    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.