es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo capturar un evento cuando la computadora se reanuda del modo de suspensión/hibernación?

Tengo una aplicación de consola que se ejecuta en .net 4.5 (solo).
Estoy tratando de detectar cuando la computadora vuelve del modo de suspensión/hibernación.
Intenté usar Win32.SystemEvents.PowerModeChanged pero por alguna razón no funciona…
Estoy usando una laptop ThinkPad con Windows 10. Cuando desconecto el cable de carga, sí dispara el evento con el argumento Modo = PowerModes.StatusChange.

class Program
{
    static void Main(string[] args)
    {
        SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(SystemEvents_PowerModeChanged);
        Console.WriteLine("Esta aplicación está esperando eventos del sistema.");
        Console.WriteLine("Presione <enter> para terminar esta aplicación.");
        Console.ReadLine();
    }
}

private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
    Console.WriteLine(Enum.GetName(typeof(PowerModes), e.Mode));
    File.WriteAllText("test.txt", "test");
}

Intenté imprimir en la pantalla y escribir en un archivo, pero no logré hacerlo funcionar…

Por favor, si alguien tiene alguna idea o enfoque diferente, al final necesito capturar cuando la computadora regresa del modo de suspensión o hibernación.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una solución alternativa podría ser utilizar la clase System.Threading.Thread para verificar continuamente los cambios en el estado de energía del sistema utilizando la propiedad SystemInformation.PowerStatus.

    Aquí hay un ejemplo de fragmento de código:

    class Program
    {
        static void Main(string[] args)
        {
            // Almacena el estado de energía inicial del sistema
            var initialPowerStatus = SystemInformation.PowerStatus;
    
            // Ejecuta un hilo en segundo plano para verificar continuamente los cambios en el estado de energía
            ThreadPool.QueueUserWorkItem(_ =>
            {
                while(true)
                {
                    // Espera 1 segundo antes de verificar nuevamente el estado de energía
                    Thread.Sleep(1000);
    
                    var currentPowerStatus = SystemInformation.PowerStatus;
    
                    // Verifica si el sistema ya no está en modo de suspensión/hibernación
                    if(currentPowerStatus.PowerLineStatus != initialPowerStatus.PowerLineStatus
                        || currentPowerStatus.BatteryChargeStatus != initialPowerStatus.BatteryChargeStatus
                        || currentPowerStatus.SystemStatusFlag != initialPowerStatus.SystemStatusFlag)
                    {
                        // El estado de energía ha cambiado - realiza las acciones requeridas aquí
                        Console.WriteLine("El estado de energía del sistema ha cambiado.");
                        break;
                    }
                }
            });
    
            Console.ReadLine(); // Mantiene abierta la aplicación de consola
        }
    }
    

    Este código verifica continuamente los cambios en el estado de energía del sistema cada segundo. Si se detecta un cambio, se sale del bucle y se permite realizar las acciones requeridas en ese evento.

    ¡Espero que esto sea una alternativa útil!

Comments are closed.