unload open form evento event closing close application another and c# .net winforms shutdown

c# - open - evento closing



¿Cómo simular el apagado de Windows para la depuración? (4)

Tengo un problema con mi aplicación cuando se cierra Windows: mi aplicación no sale muy bien, lo que da como resultado que se muestre la ventana Finalizar tarea. ¿Cómo puedo usar el depurador para ver qué está pasando?

¿Hay alguna manera de enviar los mensajes de cierre de Windows a mi aplicación para que piense que Windows se está cerrando, para que pueda ver exactamente cómo se comporta?


Creo que cuando Windows se cierra envía una "WM_QueryEndSession" a todas las aplicaciones. Para simular un cierre de Windows, podría crear una pequeña aplicación que solo haga un PostMessage con este mensaje para su aplicación y ver qué sucede. Windows puede enviar más mensajes que eso para cerrar su aplicación (como WM_CLOSE), pero cada vez que su aplicación recibe el mensaje "WM_QueryEndSession" significa que su aplicación está a punto de sacar el tapete de debajo.


Hay una herramienta llamada Restart Manager (rmtool.exe) en las herramientas de prueba de Logo de Microsoft para Windows, que se puede utilizar para enviar el cierre y reiniciar mensajes a un proceso. Las herramientas de prueba del logotipo se pueden descargar aquí:

http://download.microsoft.com/download/d/2/5/d2522ce4-a441-459d-8302-be8f3321823c/LogoToolsv1.0.msi

Luego puede simular el apagado de su proceso:

rmtool.exe -p [PID] -S

donde [PID] es la identificación del proceso. De acuerdo con el documento de Vista Logo Certification Test Cases,

Los mensajes de apagado del Administrador de reinicio son:

a. WM_QUERYENDSESSION con LPARAM = ENDSESSION_CLOSEAPP (0x1): las aplicaciones de GUI deben responder (TRUE) inmediatamente para prepararse para un reinicio.

segundo. WM_ENDSESSION con LPARAM = ENDSESSION_CLOSEAPP (0x1): la aplicación debe cerrarse en 5 segundos (20 segundos para los servicios).

do. CTRL_SHUTDOWN_EVENT: las aplicaciones de consola deben cerrarse inmediatamente.


Puede usar el evento SystemEvents.SessionEnding , que se SystemEvents.SessionEnding cuando un usuario cierra la sesión o se cierra. Sin embargo, tenga cuidado al usarlo; algunos recursos no están garantizados para estar disponibles. Por ejemplo, mi aplicación necesitaba conectarse a un servidor cuando se estaba apagando para desconectar a un usuario (una aplicación de reloj horario), pero a veces la tarjeta de red ya está deshabilitada cuando ocurre este evento. Como solo está haciendo la limpieza, esto debería funcionar bien.


SendMessage se puede usar para enviar mensajes de ventana con cualquier parámetro a una ventana.

Muy útil para la depuración y prueba.

  1. Envíe el mensaje WM_QUERYENDSESSION con LPARAM = ENDSESSION_CLOSEAPP . La aplicación debe devolver 1 (VERDADERO) para indicar que está preparado para apagar y reiniciar.

  2. Envíe el mensaje WM_ENDSESSION con LPARAM = ENDSESSION_CLOSEAPP La aplicación debe cerrarse dentro del período de tiempo de espera especificado.