Cómo detectar los eventos de bloqueo, desbloqueo, inicio y cierre de sesión de Windows en una app de C#
Usa SystemEvents.SessionSwitch en una app de escritorio o de consola, sobrescribe OnSessionChange en un servicio de Windows, o engancha WM_WTSSESSION_CHANGE tú mismo. Incluye código de .NET 10 para los tres enfoques, el hilo oculto '.NET System Events', por qué los servicios ven el inicio de sesión y las apps de escritorio no, las notificaciones fuera de orden y cómo consultar el estado de bloqueo actual con WTSQuerySessionInformation.