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
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
und hier die Adminfunktion
Spoiler anzeigen
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)
$GUI_Admin_Label01 = GUICtrlCreateLabel("Administrationsbereich", 88, 16, 249, 33)
GUICtrlSetFont(-1, 18, 400, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)
$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)
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)
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
$GUI_Admin_Label02 = GUICtrlCreateLabel("Heute noch", 16, 136, 126, 33)
GUICtrlSetFont(-1, 18, 400, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)
$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)
$GUI_Admin_Label03 = GUICtrlCreateLabel("Minuten übrig", 280, 136, 150, 33)
GUICtrlSetFont(-1, 18, 400, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)
$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 ###
While 2
$nMsg2 = GUIGetMsg()
Switch $nMsg2
Case $GUI_EVENT_CLOSE
GUIDelete($GUI_Admin)
ExitLoop
Case $GUI_Admin_Button03
GUIDelete($GUI_Admin)
ExitLoop
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)
$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
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
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)
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
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