I want to prevent the monitor from going to sleep (the windows setting, not the monitor setting). I am using c++. What call do I make?
class KeepDisplayOn
{
public:
KeepDisplayOn()
{
mPrevExecState = ::SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED | ES_CONTINUOUS);
::SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0, &mPrevScreenSaver, 0);
::SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, FALSE, NULL, 0);
}
~KeepDisplayOn()
{
::SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, mPrevScreenSaver, NULL, 0);
::SetThreadExecutionState(mPrevExecState);
}
private:
UINT mPrevScreenSaver;
EXECUTION_STATE mPrevExecState;
};
A simpler way that doesn't modify global system state like the first response does:
In your window procedure, add a handler for WM_SYSCOMMAND. When wParam is SC_MONITORPOWER, return 0 instead of deferring to DefWindowProc. (When wParam is any other value, make sure you either handle the message or pass it to DefWindowProc. Otherwise the user will have difficulty adjusting your window at runtime.)
SetThreadExecutionState(ES_DISPLAY_REQUIRED|ES_CONTINUOUS);
Wiggle the mouse every minute or so.
mouse_event(MOUSEEVENTF_MOVE,1,0,0,0);
mouse_event(MOUSEEVENTF_MOVE,-1,0,0,0);
Sleep(60000);