Como evitar que o Windows entre em estado ocioso?

Eu estou trabalhando em um aplicativo c # que é executado em segundo plano sem qualquer controle do Windows.

Desejo notificar o Windows de que meu aplicativo ainda está ativo para evitar que o Windows entre no estado inativo.

Existem APIs disponíveis para chamadas do meu aplicativo que notificam o sistema operacional Windows de que meu aplicativo ainda está ativo?

Desde já, obrigado.

Você tem que usar a function SetThreadExecutionState . Algo assim:

public partial class MyWinForm: Window { private uint fPreviousExecutionState; public Window1() { InitializeComponent(); // Set new state to prevent system sleep fPreviousExecutionState = NativeMethods.SetThreadExecutionState( NativeMethods.ES_CONTINUOUS | NativeMethods.ES_SYSTEM_REQUIRED); if (fPreviousExecutionState == 0) { Console.WriteLine("SetThreadExecutionState failed. Do something here..."); Close(); } } protected override void OnClosed(System.EventArgs e) { base.OnClosed(e); // Restore previous state if (NativeMethods.SetThreadExecutionState(fPreviousExecutionState) == 0) { // No way to recover; already exiting } } } internal static class NativeMethods { // Import SetThreadExecutionState Win32 API and necessary flags [DllImport("kernel32.dll")] public static extern uint SetThreadExecutionState(uint esFlags); public const uint ES_CONTINUOUS = 0x80000000; public const uint ES_SYSTEM_REQUIRED = 0x00000001; } 

Você tem algumas opções:

  • Use SetThreadExecutionState , que:

    Permite que um aplicativo informe ao sistema que está em uso, evitando, assim, que o sistema entre em suspensão ou desligue o monitor enquanto o aplicativo está em execução.

    Onde você poderia usar o sinalizador ES_SYSTEM_REQUIRED para

    Força o sistema a estar no estado de trabalho, redefinindo o timer inativo do sistema.

  • Use SendInput para falsificar o pressionamento de tecla, movimento do mouse / cliques

  • Outra alternativa seria alterar seu aplicativo para ser um serviço do Windows.

Exemplo de SetThreadExecutionState

 // Television recording is beginning. Enable away mode and prevent // the sleep idle time-out. SetThreadExecutionState( ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED); // Wait until recording is complete... // Clear EXECUTION_STATE flags to disable away mode and allow the system // to idle to sleep normally. SetThreadExecutionState(ES_CONTINUOUS); 

Você pode usar SetThreadExecutionState descrito aqui:

  • Função SetThreadExecutionState

Uma vez que é uma function da API do Win32, para usá-lo a partir de C # você precisará PInvoke-lo. As etapas são descritas aqui, incluindo um método de amostra PreventSleep para desativar temporariamente o modo de suspensão:

  • PInvoke.net: setthreadexecutionstate (kernel32)

Eu não acho que haja alguma maneira de fazer isso diretamente no código gerenciado.

Uma pesquisa rápida revela este post de 2 anos atrás. Basicamente, você precisaria fazer alguma interoperabilidade para chamar uma API do Windows simples.

Aqui está a implementação de SetThreadExecutionState C #