2011-11-15 11 views
25

Tengo una aplicación de Windows Forms que cuando se cierra la ventana principal, muestra un cuadro de diálogo básico que confirma la acción. Si el usuario decide cancelar la aplicación, se cancela la salida.Aplicación de fuerza cerca del cierre del sistema

Sin embargo, cuando la aplicación se ejecuta minimizada y el usuario desea apagar la PC, la secuencia de apagado se detiene porque mi aplicación está esperando que el usuario confirme el cierre de la aplicación (se muestra el cuadro de diálogo).

Pensé en agregar un temporizador para hacer un tiempo de espera y si no recibo respuesta en un cierto período de tiempo, cierre la aplicación automáticamente, pero incluso si esta es una forma de hacerlo, ciertamente NO es como lo hacen todas las demás aplicaciones eso.

Entonces, ¿qué sería una solución óptima para confirmar el apagado de la aplicación en cualquier otro caso, a menos que el sistema se cierre?

¡Gracias!

Respuesta

46

En su evento de cierre de formularios, compruebe la propiedad FormClosingEventArgs 'CloseReason para ver por qué se cierra la ventana. Si es CloseReason.WindowsShutDown, entonces no muestre su diálogo y no cancele el cierre de su formulario.

private void MyForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    // Verify that we're not being closed because windows is shutting down. 
    if (e.CloseReason != CloseReason.WindowsShutDown) 
    { 
     // Show your dialog/cancel closing. 
    } 
} 

N.B: También podría querer incluir CloseReason.TaskManagerClosing como el usuario claramente quiere cerrar su aplicación en ese escenario y el administrador de tareas ya se pide confirmación. O alternativamente, solo muestre su cuadro de diálogo para CloseReason.UserClosing.

+1

+1 porque también aprendí algo :-) –

+0

Muchas gracias **. ¡Esto me ayudó mucho! –

0

Puede escuchar el shutdown event y salir de la aplicación sin un cuadro de mensaje.

9

En el controlador de eventos de cierre, que se puede definir así:

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

y donde supongo que está publicando su cuadro de diálogo de confirmación, puede verificar el argumento de la razón de cierre, y no publicar el diálogo si es el cierre que lo causa:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (e.CloseReason == CloseReason.WindowsShutDown) 
     { 
      //do not show the dialog 
     } 
    } 
6

SystemEvents puede ayudarlo. El inicio de sesión ocurre cuando el usuario está intentando cerrar la sesión o apagar el sistema.

Microsoft.Win32.SystemEvents.SessionEnding += (sender, e) => DoYourJob(); 
+0

+1 SystemEvents, increíble No sabía nada de eso. –

+0

Ídem, útil para mi situación: proporcione una IU de "reemplazo" a una aplicación que carece de validación, y la PC está tan bloqueada que no puede reiniciar la aplicación si la cierra. –

Cuestiones relacionadas