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?
+12
A:
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;
};
sean e
2009-06-16 19:10:33
nice use of RAII
Johannes Schaub - litb
2009-06-16 19:20:47
But setting the screen saver time out is not necessary once you set the thread execution state to ES_DISPLAY_REQUIRED. What if the user wants to change the screen saver settings while the application's running?
macbirdie
2009-06-17 13:32:19
+5
A:
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.)
ChrisV
2009-06-16 21:56:37