Pregunta

¿Cuál es la mejor manera de desactivar Alt. + F4 en un formulario win de C# para evitar que el usuario cierre el formulario?

Estoy usando un formulario como cuadro de diálogo emergente para mostrar una barra de progreso y no quiero que el usuario pueda cerrarla.

¿Fue útil?

Solución

Esto hace el trabajo:

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

Editar:En respuesta a la preocupación de pix0rs, sí, tiene razón en que no podrá cerrar la aplicación mediante programación.Sin embargo, puedes simplemente eliminar el controlador de eventos para el evento form_closing antes de cerrar el formulario:

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

Otros consejos

Si miras el valor de FormClosingEventArgs e.CloseReason, le dirá por qué se cierra el formulario.Luego puedes decidir qué hacer, los valores posibles son:

Nombre de miembro - Descripción


Ninguno - La causa del cierre no fue definida o no pudo determinarse.

WindowsApagar - El sistema operativo cierra todas las aplicaciones antes de apagarse.

MdiFormCierre - El formulario principal de este formulario de interfaz de documentos múltiples (MDI) se está cerrando.

Cierre de usuario - El usuario cierra el formulario a través de la interfaz de usuario (UI), por ejemplo, haciendo clic en el botón Cerrar en la ventana del formulario, seleccionando Cerrar en el menú de control de la ventana o presionando ALTA+F4.

Administrador de tareasCerrando - El Administrador de tareas de Microsoft Windows está cerrando la aplicación.

FormularioPropietarioCierre - El formulario de propietario se está cerrando.

AplicaciónSalidaLlamada - Se invocó el método Exit de la clase Aplicación.

Creo que esta es la forma correcta de hacerlo:

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

  base.OnFormClosing(e);
}

Tenga en cuenta que se considera de mala educación que una aplicación impida por completo cerrarse.Debe verificar los argumentos del evento de cierre para determinar cómo y por qué se solicitó el cierre de su aplicación.Si se debe a un apagado de Windows, no debes evitar que se produzca el cierre.

Podrías manejar el FormClosing evento y conjunto FormClosingEventArgs.Cancel a true.

Estoy usando un formulario como cuadro de diálogo emergente para mostrar una barra de progreso y no quiero que el usuario pueda cerrarla.

Si el usuario está decidido a cerrar su aplicación (y tiene el conocimiento suficiente) para presionar alt+f4, lo más probable es que también tenga el conocimiento suficiente para ejecutar el administrador de tareas y cerrar su aplicación.

Al menos con alt+f4 tu aplicación puede cerrarse correctamente, en lugar de simplemente hacer que la gente la elimine.Por experiencia, que la gente elimine tu aplicación significa archivos de configuración corruptos, bases de datos rotas, tareas a medio terminar que no puedes reanudar y muchas otras cosas dolorosas.

Al menos pregúntales "¿estás seguro?" en lugar de impedirlo rotundamente.

Este es un truco para desactivar Alt. + F4.

private void test_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this.ModifierKeys == Keys.Alt || this.ModifierKeys == Keys.F4) 
    { 
        e.Cancel = true; 
    }    
}

Esto hace el trabajo:

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;
  }


}

¿Se llamaría a FormClosing incluso cuando esté cerrando la ventana mediante programación?Si es así, probablemente desee agregar algún código para permitir que el formulario se cierre cuando haya terminado (en lugar de cancelar siempre la operación).

Formulario de suscripciónEvento de cierre

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

Sólo una línea en el cuerpo del método.

Oculte el botón de cerrar en el formulario usando lo siguiente en el constructor del formulario:

this.ControlBox = false;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top