Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to prevent Windows from entering idle state?

Tags:

c#

windows

I am working on a C# application which runs in the background without any Windows control.

I want to notify Windows that my application is still alive to prevent Windows from going into the idle state.

Are there any APIs available to call from my application which notify the Windows OS that my application is still alive?

Thanks in advance.

like image 737
user724789 Avatar asked Jun 10 '11 05:06

user724789


People also ask

How to not go Idle Windows?

Go to Control Panel > Personalization > Change Screensaver. Next to On Resume, Display Logon Screen, uncheck the box. This prevents your system from sleeping.

How Do I Stop Windows 10 from Going Idle?

Change the Power Settings (Windows 10) Click on System and Security. Next to go to Power Options and click on it. At the right, you will see Change plan settings, you have to click on it to change the power settings. Customize the options Turn off the display and Put the computer to sleep using the drop-down menu.


2 Answers

You've to use SetThreadExecutionState function. Something like this:

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; } 
like image 186
Joao Avatar answered Sep 29 '22 08:09

Joao


You have a couple of options:

  • Use SetThreadExecutionState, which:

    Enables an application to inform the system that it is in use, thereby preventing the system from entering sleep or turning off the display while the application is running.

    Where you could use the ES_SYSTEM_REQUIRED flag to

    Forces the system to be in the working state by resetting the system idle timer.

  • Use SendInput to fake keystroke, mouse motion/clicks

  • Another alternative would be to change your app to be a Windows service.

SetThreadExecutionState example

// 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); 
like image 40
Gustavo Mori Avatar answered Sep 29 '22 09:09

Gustavo Mori