Kinderschutz: Prozess-wird-beendet-handler?

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Alex2000.

    Äh, nein.
    Mein Prozess soll nicht beendet werden, da der Kinderschutz sonst unwirksam ist.
    Außerdem wäre es toll, wenn ich benachrichtigt werde, (per mail im Hanler, den ich dann noch brauche) soblad versucht wird, den Prozess zu beenden.
    Ich denke er will, dass seine Anwendung nicht Beendet werden kann ohne ein Passwort ect.
    Da musst du einfach im Ereigniss "FormClosing" eine InputBox oder ähnliches machen, wo das Pass abgefragt wird und wenn das Pass nicht stimmt, den Process mit "e.cancel = true" abbrechen.
    ich versuchs mal, einen Moment...
    Nein.
    Das ist, wenn versucht wird, das Programm zu schließen.
    Ich will aber verhindern, dass das Programm (der Prozess!) nicht im Taskmanager beendet/abgeschossen wird.
    Und dann soll vielleicht noch eine MsgBox angezeigt werden.

    Danke
    Olicrash

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „olicrash“ ()

    Achso du möchtest verhindern das ein Prozess beendet wird.

    Hmm...
    Geht auf jeden Fall nur durch eingriff in die WinAPI.

    Ich hätte nun folgende Idee:
    mit SetWindowsHookEx einen CallWndProc Hook setzten.
    Dafür brauchst das FensterHandle der Anwendung.
    Wenn du dann die dort aufgefangenen Messages filterst kannst du den WM_Close Befehl abfangen und dann nicht an CallNextHook weiter geben.
    Zur Sicherheit solltest du auch noch die WM_Destroy Message abfangen.

    Wie genau das zusammen muss müsste ich selber noch schauen.
    Referenzen (MSDN):
    Using Hooks
    SetWindowsHookEx
    CallNextHookEx
    WM_CLOSE
    WM_DESTROY
    wäre nett, wenn mir jemand einen Code geben könnte, da ich das nicht wirklich verstehe, was da steht.
    Der Code sollte nur beinhalten:

    -Prozess kann nicht beendet werden
    -Wenn das versucht wird, MsgBox("Der Prozess darf nicht beendet werden!")

    Das wäre sehr nett.

    Danke
    Olicrash

    PS: Ich habe noch den ganzen Tag oder bis morgen Zeit.
    So wie ich dir das erklärt habe, einfach mit dem FormClosing Event abfangen.
    Du kannst auch prüfen wie es geschlossen werden soll:

    VB.NET-Quellcode

    1. Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
    2. If e.CloseReason() = CloseReason.UserClosing Then
    3. e.Cancel = True
    4. End If
    5. End Sub


    Oder den Taskmanager abfangen:

    VB.NET-Quellcode

    1. If e.CloseReason = CloseReason.TaskManagerClosing Then
    2. e.Cancel = true
    3. End If


    So kann dein Prog nicht durch alt F4 oder Taskman beendet werden. Aber man kann auch einfach PC aus, dann wieder an und dann ises auch weg.
    Nein, der Prozess lässt sich immernoch mit dem Taskmanager abschießen.
    (Taskmanager-Prozesse-Prozess beenden)

    Der Prozess soll "unkillbar" sein!

    Wie ich bereits erwähnte:

    Sobald ein Kind herausfindet, dass man Prozesse beenden kann, habe ich momentan verloren...
    Hm, nicht die beste Methode aber du kannst mit "CloseReason" in FormClosing abfragen, was der Grund für das schließen des Programms war. Wenn es nicht PCShutdown oder so ähnlich war, mit Process.Start Programm erneut aufrufen.

    Also nicht mit e.Cancel sondern wenn es nicht geht mit neustarten.
    Hm also eigentlich sollte e.Cancel gehen, versuch es so:

    VB.NET-Quellcode

    1. Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
    2. If CloseReason.WindowsShutDown = False Then
    3. e.Cancel = True
    4. End If
    5. End Sub
    IMessageFilter.PreFilterMessage ist was du suchst.

    Hab mich grad mal dran versucht bin aber nicht weit gekommen.

    Refs:

    PreFilterMessage Method

    Die const für die Messages:

    VB.NET-Quellcode

    1. Private Const WM_CLOSE As Integer = &H10
    2. Private Const WM_DESTROY As Integer = &H2


    Ich schau mir das ganze mal weiter an.
    Sollte machbar sein.
    Aber das ganze sollte dann mit nem Schalter sein (Boolean Variable) um z.b. nach eingabe eines Passwortes die Anwendung trozdem beeden zu können.
    Sonst könnte es sein das sich der Rechner nicht runterfahren lässt.
    Bist du sicher, dass das so geht. Windows fährt ja trotzdem runter und löscht den Arbeitsspeicher. Übrigens kann man sowas leicht mit Process killen umgehen. Ich würde eher den Taskmanager aus der Registry streichen(hab mal gehört das soll gehen, Alt F4 blocken eine Verknüpfung in den Autostart legen. Dann hast du einen besseren Schutz.
    Auch gerade gemerkt, dass der Code net funzt, sorry. Mach´s damit, damit kannst du alle Möglichkeiten zum schließen zunichte machen, bis auf den Taskmanager:

    VB.NET-Quellcode

    1. Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
    2. e.Cancel = True
    3. End Sub

    Du kannst es aber so machen, dass du den Taskmanager gar nicht durch die Tastencombi sich öffnen lässt (einfach Tasten abfragen, siehe Hotkeys) oder prüfst ob er aktiv ist und ihn dann abschießt. Frag mal die Leute mit den Desktoplocks usw wie die das gemacht haben (-> Showroom & Testcenter). Die haben ihn geblockt gekriegt.