83 votes

Comment désactiver la fermeture du formulaire par Alt + F4 ?

Quel est le meilleur moyen de désactiver Alt + F4 dans un formulaire win c# pour empêcher l'utilisateur de fermer le formulaire ?

J'utilise un formulaire comme boîte de dialogue contextuelle pour afficher une barre de progression et je ne veux pas que l'utilisateur puisse la fermer.

0 votes

Dans le gestionnaire d'événement FormClosing, ne pourriez-vous pas interroger le tampon du clavier (y avez-vous même accès ?) pour voir si les touches [Alt] + [F4] ont été pressées, annuler si c'est le cas, continuer sinon ?

110voto

Martin Points 15155

Cela fait l'affaire :

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = true;
}

Edit : En réponse à la préoccupation de pix0rs - oui, vous avez raison, vous ne serez pas en mesure de fermer l'application de manière programmatique. Cependant, vous pouvez simplement supprimer le gestionnaire d'événement pour l'événement form_closing avant de fermer le formulaire :

this.FormClosing -= new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
this.Close();

4 votes

Je soupçonne que la plupart des gens mettent en œuvre cette méthode sur le formulaire en question (Form1). Dans ce cas, il est recommandé de ne pas attacher un délégué, mais plutôt de surcharger la méthode OnFormClosing. "La méthode OnFormClosing permet également aux classes dérivées de gérer l'événement sans attacher de délégué. C'est la technique préférée pour gérer l'événement dans une classe dérivée." tinyurl.com/3dzzljq

11 votes

J'aurais fait le gestionnaire d'événement comme tel : e.Cancel = (e.Reason == CloseReason.UserClosing); . De cette façon, vous garantissez que vous ne fermerez pas le formulaire uniquement lorsque l'UTILISATEUR essaie de le fermer.

1 votes

Cette approche a un gros problème : si vous voulez arrêter/redémarrer votre PC, il annulera également cette demande (du moins sous Windows XP).

62voto

Matt Warren Points 7297

Si vous regardez le valeur de FormClosingEventArgs e.CloseReason il vous dira pourquoi le formulaire est fermé. Vous pouvez alors décider de ce qu'il faut faire, les valeurs possibles sont :

Nom du membre - Description


Aucun - La cause de la fermeture n'a pas été définie ou n'a pu être déterminée.

WindowsShutDown - Le système d'exploitation ferme toutes les applications avant de s'arrêter.

MdiFormClosing - Le formulaire parent de ce formulaire MDI (Multiple Document Interface) se ferme.

UserClosing - L'utilisateur ferme le formulaire par le biais de l'interface utilisateur (IU), par exemple en cliquant sur le bouton Fermer de la fenêtre du formulaire, en sélectionnant Fermer dans le menu de contrôle de la fenêtre ou en appuyant sur la touche ALT + F4 .

TaskManagerClosing - Le gestionnaire des tâches de Microsoft Windows ferme l'application.

FormOwnerClosing - Le formulaire du propriétaire est en cours de fermeture.

ApplicationExitCall - La méthode Exit de la classe Application a été invoquée.

9 votes

Si seulement ils ont ventilé UserClosing pour être plus granulaire afin que vous puissiez cibler Alt+F4 spécifiquement...

1 votes

Si (e.CloseReason == CloseReason.UserClosing) { e.Cancel = true ; }

0 votes

Combinez CloseReason y DialogResult pour de meilleurs résultats.

27voto

antsyawn Points 563

Je pense que c'est la bonne façon de procéder :

protected override void OnFormClosing(FormClosingEventArgs e)
{
  switch (e.CloseReason)
  {
    case CloseReason.UserClosing:
      e.Cancel = true;
      break;
  }

  base.OnFormClosing(e);
}

0 votes

Mieux vaut remplacer la pause par le retour

0 votes

En fait, je pense que le modèle correct est de mettre le drapeau d'annulation à true et ensuite d'appeler la classe de base. Lorsque l'on surcharge les méthodes On[Event], il est important d'appeler la classe de base afin que tous les abonnés à l'événement soient également notifiés de l'événement. Oui, dans ce cas, il est facile de penser que puisque vous avez annulé l'événement, personne d'autre n'a besoin de le savoir, mais je ne pense pas qu'il soit correct de faire cette supposition.

0 votes

Je ne suis pas sûr de la raison, mais si j'appelle la classe de base, mon application se bloque après une nouvelle frappe Alt+F4. Au début, je pensais que c'était parce que la touche F4 avait une autre signification dans mon application, mais une longue session de débogage a montré le contraire. Quoi qu'il en soit, il s'agit peut-être d'un cas particulier dans mon cas. Merci pour cette excellente réponse.

16voto

Lasse V. Karlsen Points 148037

Notez qu'il est mal vu pour une application d'empêcher complètement sa fermeture. Vous devez vérifier les arguments de l'événement de fermeture pour déterminer comment et pourquoi votre application a été invitée à se fermer. Si c'est à cause d'un arrêt de Windows, vous ne devez pas empêcher la fermeture de se produire.

13voto

Timbo Points 14117

Vous pourriez vous occuper de la FormClosing et définir FormClosingEventArgs.Cancel a true .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X