Skip navigation

Preventing or stopping the screensaver from going on from your C++ Windows program

To intercept the screensaver on Win32, you trap the WM_SYSCOMMAND message in your WndProc, then you check the value of wparam. SC_SCREENSAVE is the screensaver and SC_MONITORPOWER is that windowsy force that wants to shut off the monitor to save power.

To disable either, just return 0 from the event handler function under those cases.

Example:

// This is a piece of WNDPROC:
LRESULT CALLBACK WndProc(   HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam ) 
{
    switch( message )
    {
    .
    .
    .
        case WM_SYSCOMMAND:
        {
            // There is a system command
            // wparam has the exact command type that it is
            switch( wparam )
            {
                case SC_MOVE:
                    printf("You're moving the window!\n");
                    // don't interfere with this one, otherwise your window
                    // won't move normally when the user tries to move it!
                    break;

                case SC_SCREENSAVE:     // screensaver wants to begin
                    
                    return 0;           // returning 0 PREVENTS those things from happening
                    // Note about SC_SCREENSAVE:
                    // Try this.  Go into your settings and change
                    // your screensaver to start after 1 minute.
                    // Then run this program and sit and wait
                    // for the 1 minute.

                    // The funny thing about this, is Windows will
                    // keep trying to enter screen saver mode,
                    // by sending your app a "message" every
                    // half a second or so.

                    // If all you do is return 0; from this
                    // part, your app will keep on stopping
                    // the screensaver from starting.  And
                    // Windows will keep asking if it can
                    // start the screen saver or not, until
                    // the user does something to reset the
                    // screensaver-turn-on timer like move the mouse
                    // or press a key on the keyboard.

                    // if you wait even longer, the same thing
                    // happens with SC_MONITORPOWER, except
                    // you keep getting 2 messages now.
                    
                    case SC_MONITORPOWER:   // monitor wants to shut off - powersaver mode
                        return 0;           // returning 0 PREVENTS monitor from turning off
            } // end wparam inner switch
        } //end case WM_SYSCOMMAND
            .
            .
            .
    } // end switch(message)
} // end WndProc

Leave a comment