I have also written this article in my blog, Just Like a Magic.
This lesson focuses on how to programmatically turn on the screen saver.
In Windows, you can turn it on automatically by leaving the machine inactive for a specific period. You can control this period from the Screen Saver options from the desktop properties dialog. The following figure shows the Screen Saver Settings dialog.
Programmatically Turning on the Screen Saver
In this section, we will learn how to turn on the screen saver in .NET and C#. Of course you can write the code in any language you prefer, but here we will write it in C#. You can turn on the screen saver by sending the
WM_SYSCOMMAND message with the parameter
SC_SCREENSAVE. Sending a message can be done using the
SendMessage() function that resides in the User32.dll library. The definition of this function is as follows:
This function takes four arguments:
hWnd: Handle to the window to send the message to. You can set this argument to a window handle, the desktop handle (
HWND_DESKTOP), or the handle for all top-level windows (
Msg: The message to send.
wParam: Additional message-specific options.
lParam: Additional message-specific options.
This function returns a value specific to the message sent. Usually, it returns non-zero if it succeeds or zero otherwise. Here is the full code:
public static extern int SendMessage
public const uint WM_SYSCOMMAND = 0x112;
public const uint SC_SCREENSAVE = 0xF140;
public enum SpecialHandles
HWND_DESKTOP = 0x0,
HWND_BROADCAST = 0xFFFF
public static void TurnOnScreenSaver()
First, we created our
PInvoke method. This method is decorated by the
DllImportAttribute attribute specifying the library which the method resides in. Also
PInvoke methods must be declared as "
static" and "
LRESULT is defined as a signed 32-bit integer, it is marshaled as
System.Int32 in .NET. Also, because
System.IntPtr is the best type for marshaling any Win32 raw handle, we have used it for the first argument.
LPARAM are all defined as an unsigned 32-bit integer, so we have marshaled them as
HWND_BROADCAST represents the handle for all top-level windows, so we have sent them the order to turn on the screen saver.
PInvoke stands for Platform Invocation, it is the process of creating a wrapper for the .NET to interact with unmanaged functions.
Marshaling is the process of creating a bridge between .NET types and unmanaged types.
You can use
PostMessage() in place of
SendMessage() if you want to send the message asynchronously and don't want to wait for a response.
- 20th May, 2009: Initial post