C# Beenden von Anwendung verhindern

In diesen Beitrag werde ich eine Anwendung programmieren, die das ungewollte schließen von Anwendungen verhindern soll.

Mechanismen um ungewolltes schließen der Anwendung zu verhindern:

  • Die Anwendung wird in Vollbildmodus gestartet
  • Anwendung verfügt über keine Statusleiste (kein Rahmen um das Fenster)
  • Alt+F4 und andere Tastenkombinationen werden außer Kraft gesetzt.
  • Beim Ausführen der Anwendung wird der Explorer beendet.
  • Strg+Alt+Entf um den Taskmanager aufzurufen wird verhindert.

Das fertige Projekt kann auch sofort Runtergeladen werden:

Win_Fullscreen.zip

!!!Wichtig: Um die Anwendung zu schließen einfach die Tasten Strg+Shift+Alt+Q gleichzeitig drücken.

Nachdem man ein neues Projekt erstellt hat, bearbeiten wir nun die Eigenschaften der Form, um den Rahmen und die Statusleiste der Form zu entfernen. Dazu wird die Eigenschaft FormBorderStyle auf None gesetzt.

Im nächsten Schritt werden wir dafür sorgen, dass die Anwendung sich im Vollbildmodus startet. Dazu wird die Eigenschaft WindowState auf Maximized gesetzt.

Nun brauchen wir noch 3 Events von der Form. Wir brauchen das Load, FormClosing und KeyDown Event. Jedes Event wird mit einem Doppelklick in den Code implementiert.

Einige Bibliotheken werden noch gebraucht:

using System.Diagnostics;

Nun widmen wir uns den Code zu, der im Load Event ausgeführt werden soll.

private void frmFullscreen_Load(object sender, EventArgs e)
        {
            //Verhindern, dass man den Task Manager bedienen kann. Beim Öffnen wird dieser in den Hintergrund gelegt. 
            ProcessStartInfo psii = new ProcessStartInfo(System.IO.Path.Combine(Environment.SystemDirectory, "taskmgr.exe"));
            psii.RedirectStandardOutput = false;
            psii.WindowStyle = ProcessWindowStyle.Hidden;
            psii.UseShellExecute = true;
            var processTaskMgr = Process.Start(psii);
            this.SendToBack();

            //Explorer abschalten. Startmenü erscheint nach dem beenden von explorer.exe auch nicht mehr. 
            var psi = new ProcessStartInfo("taskkill", "/IM explorer.exe /f");
            psi.CreateNoWindow = true;
            psi.UseShellExecute = false;
            Process.Start(psi);
        }

Im KeyDown Event wird folgender Code hinzugefügt:

private void frmFullscreen_KeyDown(object sender, KeyEventArgs e)
        {
            //Mit der Tastenkombination Strg+Shift+Alt+Q kann diese Anwendung geschlossen werden.
            if (e.KeyCode == Keys.Q && e.Control && e.Shift && e.Alt)
            {
                tastenkombinationerkannt = true;
                this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
            }
        }

Im FormClosing Event wird dann folgender Code hinzugefügt:

private void frmFullscreen_FormClosing(object sender, FormClosingEventArgs e)
        {
            /*Daran hindern, dass die Form geschlossen werden kann. Außer man klickt auf den "Herunterfahren" Button 
oder die Tastenkombination Strg+Shift+Alt+Q wird ausgeführt.*/
            if (tastenkombinationerkannt == true)
            {
                //Explorer wieder einschalten. Startmenü erscheint nach dem start von explorer.exe auch wieder. 
                Process process = new Process();
                process.StartInfo.FileName = "C:\\Windows\\explorer.exe";
                process.Start();

                //Taskmanager freigeben
                var psi = new ProcessStartInfo("taskkill", "/IM Taskmgr.exe /f");
                psi.CreateNoWindow = true;
                psi.UseShellExecute = false;
                Process.Start(psi);
            }
            else
            {
                e.Cancel = true;
            }
        }

Der komplette Quellcode:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Diagnostics;

namespace Win_Fullscreen
{
    public partial class frmFullscreen : Form
    {
        public bool tastenkombinationerkannt = false;
        public frmFullscreen()
        {
            InitializeComponent();
        }

        private void frmFullscreen_Load(object sender, EventArgs e)
        {
            //Verhindern, dass man den Task Manager bedienen kann. Beim Öffnen wird dieser in den Hintergrund gelegt. 
            ProcessStartInfo psii = new ProcessStartInfo(System.IO.Path.Combine(Environment.SystemDirectory, "taskmgr.exe"));
            psii.RedirectStandardOutput = false;
            psii.WindowStyle = ProcessWindowStyle.Hidden;
            psii.UseShellExecute = true;
            var processTaskMgr = Process.Start(psii);
            this.SendToBack();

            //Explorer abschalten. Startmenü erscheint nach dem beenden von explorer.exe auch nicht mehr. 
            var psi = new ProcessStartInfo("taskkill", "/IM explorer.exe /f");
            psi.CreateNoWindow = true;
            psi.UseShellExecute = false;
            Process.Start(psi);
        }

        private void frmFullscreen_KeyDown(object sender, KeyEventArgs e)
        {
            //Mit der Tastenkombination Strg+Shift+Alt+Q kann diese Anwendung geschlossen werden.
            if (e.KeyCode == Keys.Q && e.Control && e.Shift && e.Alt)
            {
                tastenkombinationerkannt = true;
                this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
            }
        }

        private void frmFullscreen_FormClosing(object sender, FormClosingEventArgs e)
        {
            /*Daran hindern, dass die Form geschlossen werden kann. Außer man klickt auf den "Herunterfahren" Button 
oder die Tastenkombination Strg+Shift+Alt+Q wird ausgeführt.*/
            if (tastenkombinationerkannt == true)
            {
                //Explorer wieder einschalten. Startmenü erscheint nach dem start von explorer.exe auch wieder. 
                Process process = new Process();
                process.StartInfo.FileName = "C:\\Windows\\explorer.exe";
                process.Start();

                //Taskmanager freigeben
                var psi = new ProcessStartInfo("taskkill", "/IM Taskmgr.exe /f");
                psi.CreateNoWindow = true;
                psi.UseShellExecute = false;
                Process.Start(psi);
            }
            else
            {
                e.Cancel = true;
            }
        }
    }
}