Cómo detectar el cierre o cierre de sesión de Windows

Necesito detectar cuando Windows se apaga (o se reinicia) o cuando el usuario cierra la sesión. Necesito cerrar correctamente la aplicación antes de que se cierre la aplicación. Noté que no se produce ningún evento de aplicación de salida cuando Windows cierra el día.

Leí la publicación ¿Hay alguna manera en c # para detectar un cierre / cierre de sesión de Windows y cancelar esa acción (después de preguntar al usuario)

pero no estoy seguro de dónde debo realizar las operaciones antes de cerrar. Gracias.

Adjunte un método de controlador de eventos al evento SystemEvents.SessionEnding , y se SystemEvents.SessionEnding su método de controlador cada vez que se SystemEvents.SessionEnding evento . Manejar este evento le permitirá cancelar el cierre de sesión pendiente o cerrar, si lo desea. (Aunque eso no funciona realmente como suena en los sistemas operativos actuales, para obtener más información, consulte la documentación de MSDN aquí ).

Si no desea cancelar el evento, sino simplemente reactjsr de forma adecuada, debe manejar el evento SystemEvents.SessionEnded lugar.

Sin embargo, debe asegurarse de desconectar los controladores de eventos cuando la aplicación está cerrada, ya que ambos son eventos estáticos.

Puede usar una solución nativa a través de pinvoke si su código no se está ejecutando en una sesión no interactiva (como un servicio del sistema):

 //SM_SHUTTINGDOWN = 0x2000 bool bShutDownPending = GetSystemMetrics(SM_SHUTTINGDOWN) != 0;