C#: Schließen eines Programmes verhinden

Ich habe mir den Spaß erlaubt und ein kleinen IT April Scherz programmiert. Eine simple Fake Fehlermeldung, die etwas nervig sein sollte.
Dazu reicht etwas Code, der das Schließen des Programms verhindert.
Damit werden folgende Wege geblockt: X Button oben rechts, Alt+F4, Rechtsklick in der Taskleiste -> Schließen, Strg+Esc Das Programm sollte nicht nur die Shortcuts überleben sondern sich als Strafe sogar ein weiteres Mal starten.

Hier der Code:

csharp“ line=“1″>
protected override void OnClosing(CancelEventArgs e)
{
e.Cancel = true;
Main Main = new Main();
Main.Show();
}

Statt also das Programm zu schließen, wird eine weitere Instanz davon gestartet.

Ich fand auch einen zweiten Code, der das selbe bewerkstelligte. Allerdings versteh ich da nur die Hälfte und habe mich für die einfacheren Zeilen oben entschieden.
Für C# Pros hier noch der Code, vielleicht kann mir ja jemand ne Erläuterung geben und sagen, ob der Code besser wäre und warum.

csharp“ line=“1″>
protected override void WndProc(ref Message m)
{
if (m.Msg != 0x0010)
{
base.WndProc(ref m);
}
else
{
Main Main = new Main();
Main.Show();
}
}

0x0010 ist wahrscheinlich das Kill Signal, dieses wird abgefangen und statt dessen das Programm ein weiteres mal gestartet. Wenn statt dem Kill Signal ein anderer Input kommt wird dieser einfach ausgeführt. Naja hier hänge ich mich weit aus dem Fenster, nur Vermutungen.

Wer mein Programm mal testen möchte, hier ist es:
Aprilscherz

Es gibt 2 Möglichkeiten, das Programm zu beenden. Prozess killen (Prozess beenden oder taskkill) oder eine der empfindlichen Stellen anklicken:

Wo ich jetzt noch Hilfe bräuchte wäre ein globaler Tastaturhook (Kenny?? :D) in C#, um von überall im System Strg+Alt+Entf abzufangen. Oder eine andere Art, den Prozess des Programms vor dem Kill „Prozess beenden“ oder „taskkill“ zu bewahren, wenn das einfacher sein sollte. Hab das leider noch nicht hinbekommen.

4 Kommentare

  1. So gesehen, ist der erste Code sogar besser (imho). OnClosing() wird aufgerufen, während die Windows-Nachricht WM_CLOSE (0x10) verarbeitet wird.

    Bei der zweiten Variante wird direkt die Methode WndProc() überschrieben. Das ist direkt die Nachrichtenbehandlungsroutine der Anwendung. Was ich ehrlich gesagt nicht verstehe, weshalb die Klasse nochmal instanziert wird, obwohl im zweiten Beispiel die Nachricht WM_CLOSE (0x10) direkt abgefangen wird. Eigentlich sollte man dort den Else-Block sogar weglassen können.

    Ein Tastatur-Hook wird übrigens nix bringen, weil M$ darauf geachtet hat, dass man Strg+Alt+Entf nicht blockieren kann. Aaaber man kann ja einfach die API-Methoden CreateProcess…() hooken, gucken, welches Programm gestartet werden soll und das Starten von „bösen“ Anwendungen (z.B. taskkill und taskmgr/taskman) einfach unterbinden. Wenn man ganz sicher sein will, kann man zwischendurch auch noch prüfen, ob die Programme bereits laufen (insbesondere taskmgr/taskman).

    Noch besser wäre es übrigens, herauszufinden, wie der Taskmanager und Taskkill die Prozesse beenden. Dann könnte man nämlich diese Methoden hooken und beim eigenen Programm die Methode einfach fehlschlagen lassen. 😉

  2. Das Else in der WndProc dient ja dazu, dass mein Programm ein weiteres mal gestartet wird. Ich könnte else natürlich weglassen, das Schließen des Programms würde damit natürlich immernoch verhindert werden. Aber eine weitere Instanz würde sich dann nicht öffnen und das wollte ich ja.

    Wollt grad sagen, anstatt die CreateProcess Methode abzufangen würde ich lieber gleich die „KillProcess“(??) Methode suchen. Aber gut, da werde ich eventuell nochmal etwas Zeit investieren.

Schreibe einen Kommentar