Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

432
Vistas
¿Hay alguna manera de detectar un apagado del sistema desde una aplicación de consola .net C# y retrasar el apagado hasta que su programa pueda salir correctamente?

Tenga en cuenta que esta es una aplicación de consola que ejecuta .NET con C#. Además, más tarde podría convertir esto en un servicio, pero por ahora, necesito manejar el apagado mientras se ejecuta mi aplicación de consola.

Mi sistema a veces se apaga automáticamente por las actualizaciones de Windows o por las actualizaciones de Kace. Esto es irritante cuando mi programa está realizando largas pruebas en medio de la noche y no estoy allí para verlo. Me gustaría poder detectar el apagado del sistema y retrasarlo lo suficiente para que mis pruebas finalicen correctamente y me permitan salir correctamente de mi programa manteniendo todos mis datos de prueba intactos.

He mirado varios hilos y parece que no puedo encontrar una solución que funcione. He probado estos dos:

 AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit; Application.ApplicationExit += OnApplicationExit;

Pero ninguno de estos eventos parece ser despedido. Básicamente, quiero enviarme una notificación por correo electrónico cuando se detecte el apagado y pausar el apagado. O al menos registrar un mensaje de alguna manera...

Puedo simular este comportamiento usando (entre todas las cosas) ' notepad.exe '. Simplemente abro notepad.exe, escribo algo de basura y luego intento apagar mi computadora. La computadora intenta apagarse y luego muestra un mensaje que dice que no se puede apagar porque el 'bloc de notas' la está bloqueando.

Me gustaría que MI programa bloquee el apagado (o al menos lo retrase) de la misma manera que lo hace 'notepad.exe'.

Cualquier información, eventos u otras ideas que pueda tener sería muy útil. Gracias de antemano por su ayuda.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Esto puede ayudarte:

https://www.meziantou.net/prevent-windows-shutdown-or-session-ending-in-dotnet.htm

Cuando el usuario cierra sesión o cuando detiene su máquina, Windows cierra todas las aplicaciones abiertas. Algunas aplicaciones quieren ejecutar código antes de finalizar para no perder el estado actual (un documento que se está escribiendo, por ejemplo).

Para esto Windows envía un mensaje a todas las aplicaciones:

 WM_QUERYENDSESSION when closing the session WM_ENDSESSION when shutting down the machine

Windows proporciona 3 métodos:

 ShutdownBlockReasonCreate

Indica que el sistema no se puede apagar y establece una cadena de motivo que se mostrará al usuario si se inicia el apagado del sistema ("Quiero vivir" en la captura de pantalla)

 ShutdownBlockReasonDestroy

Indica que el sistema se puede apagar

 SetProcessShutdownParameters

Esta función establece una orden de apagado para un proceso en relación con los demás procesos del sistema.

El método final determina el orden en que Windows envía los mensajes WM_ENDSESSION y WM_QUERYENDSESSION a las aplicaciones. Esto se utiliza en el caso de que una aplicación A dependa de una aplicación B. La aplicación A desea ser informada antes que la aplicación B de que la máquina se detiene para bloquear potencialmente esta parada. Por lo tanto, la aplicación B permanece viva ya que la aplicación A bloquea el apagado.

La prioridad se define con un número entero entre 0 y 0x4FF. 0x4FF es la prioridad más alta (primero llamado), 0 es la prioridad más baja (último llamado). Por defecto, las aplicaciones tienen prioridad 280.

En el enlace también hay un código para WinForm que se puede adaptar. Algo como:

 private const int WM_QUERYENDSESSION=0x0011; private bool isShuttingDown=false; protected override void WndProc(ref Message m) { if(m.Msg==WM_QUERYENDSESSION) { isShuttingDown=true; } base.WndProc(ref m); }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda