Was ist der beste Weg, um Alt+ F4in ac # win-Formular zu deaktivieren, um zu verhindern, dass der Benutzer das Formular schließt?
Ich verwende ein Formular als Popup-Dialogfeld, um einen Fortschrittsbalken anzuzeigen, und möchte nicht, dass der Benutzer ihn schließen kann.
Antworten:
Das macht den Job:
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { e.Cancel = true; }
Bearbeiten: Als Reaktion auf die Bedenken von pix0rs - ja, Sie haben Recht, dass Sie die App nicht programmgesteuert schließen können. Sie können den Ereignishandler für das Ereignis form_closing jedoch einfach entfernen, bevor Sie das Formular schließen:
this.FormClosing -= new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); this.Close();
quelle
e.Cancel = (e.Reason == CloseReason.UserClosing);
. Auf diese Weise stellen Sie sicher, dass Sie nicht nur schließen, wenn der BENUTZER versucht, das Formular zu schließen.Wenn Sie sich den Wert von ansehen
FormClosingEventArgs e.CloseReason
, erfahren Sie, warum das Formular geschlossen wird. Sie können dann entscheiden, was zu tun ist. Die möglichen Werte sind:Mitgliedsname - Beschreibung
Keine - Die Ursache der Schließung wurde nicht definiert oder konnte nicht ermittelt werden.
WindowsShutDown - Das Betriebssystem schließt alle Anwendungen vor dem Herunterfahren.
MdiFormClosing - Das übergeordnete Formular dieses MDI-Formulars (Multiple Document Interface) wird geschlossen.
UserClosing - Der Benutzer schließt das Formular über die Benutzeroberfläche, indem er beispielsweise im Formularfenster auf die Schaltfläche Schließen klickt, im Steuerungsmenü des Fensters die Option Schließen auswählt oder ALT+ drückt F4.
TaskManagerClosing - Der Microsoft Windows Task-Manager schließt die Anwendung.
FormOwnerClosing - Das Eigentümerformular wird geschlossen.
ApplicationExitCall - Die Exit-Methode der Application-Klasse wurde aufgerufen.
quelle
CloseReason
undDialogResult
für beste Ergebnisse.Ich glaube, das ist der richtige Weg:
protected override void OnFormClosing(FormClosingEventArgs e) { switch (e.CloseReason) { case CloseReason.UserClosing: e.Cancel = true; break; } base.OnFormClosing(e); }
quelle
Beachten Sie, dass es für eine Anwendung als schlechte Form angesehen wird, das Schließen vollständig zu verhindern. Sie sollten die Ereignisargumente für das Closing-Ereignis überprüfen, um festzustellen, wie und warum Ihre Anwendung zum Schließen aufgefordert wurde. Wenn dies auf ein Herunterfahren von Windows zurückzuführen ist, sollten Sie das Schließen nicht verhindern.
quelle
Sie könnten den Griff
FormClosing
Ereignis und SatzFormClosingEventArgs.Cancel
zutrue
.quelle
Wenn der Benutzer entschlossen ist, Ihre App zu schließen (und über ausreichende Kenntnisse verfügt), um Alt + F4 zu drücken, verfügt er höchstwahrscheinlich auch über ausreichende Kenntnisse, um den Task-Manager auszuführen und stattdessen Ihre Anwendung zu beenden.
Zumindest mit alt + f4 kann Ihre App ordnungsgemäß heruntergefahren werden, anstatt nur Leute dazu zu bringen, sie zu töten. Aus Erfahrung bedeutet das Töten Ihrer App, dass Benutzer Ihre App beschädigen, beschädigte Datenbanken, halbfertige Aufgaben, die Sie nicht fortsetzen können, und viele andere schmerzhafte Dinge.
Fordern Sie sie zumindest mit "Sind Sie sicher" auf, anstatt dies zu verhindern.
quelle
Dies ist ein Hack zum Deaktivieren von Alt+ F4.
private void test_FormClosing(object sender, FormClosingEventArgs e) { if (this.ModifierKeys == Keys.Alt || this.ModifierKeys == Keys.F4) { e.Cancel = true; } }
quelle
System.Windows.Forms
Sie jedoch verwenden, müssen Sie die statischeControl.ModifierKeys
Eigenschaft anstelle derthis.ModifierKeys
Eigenschaft überprüfen (wie im obigen Snippet gezeigt).Abonnieren Sie das FormClosing-Ereignis
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { e.Cancel = e.CloseReason == CloseReason.UserClosing; }
Nur eine Zeile im Methodenkörper.
quelle
Das macht den Job:
bool myButtonWasClicked = false; private void Exit_Click(object sender, EventArgs e) { myButtonWasClicked = true; Application.Exit(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (myButtonWasClicked) { e.Cancel = false; } else { e.Cancel = true; } }
quelle
Würde FormClosing auch dann aufgerufen, wenn Sie das Fenster programmgesteuert schließen? In diesem Fall möchten Sie wahrscheinlich Code hinzufügen, damit das Formular geschlossen werden kann, wenn Sie damit fertig sind (anstatt den Vorgang immer abzubrechen).
quelle
Blenden Sie die Schaltfläche zum Schließen des Formulars aus, indem Sie im Konstruktor des Formulars Folgendes verwenden:
this.ControlBox = false;
quelle