You are currently offline, waiting for your internet to reconnect

How to force a screen saver to close once started in Windows NT, Windows 2000, and Windows Server 2003

Sometimes applications need to terminate a screen saver that is alreadyrunning. In Microsoft Windows 95, a screen saver could be terminatedeasily by posting a WM_CLOSE message to the currently active screen saverwindow as in this example:
PostMessage (GetActiveWindow(), WM_CLOSE, 0, 0L);
Microsoft Windows NT, however, introduces the concept of separate desktops, so thatapplications can run on one, and screen savers can run on another. Thismakes screen saver termination under Windows NT, Windows 2000, and Windows Server 2003 a bit more difficult.
More information
The process of obtaining a handle to the currently active screen saver window is different for operating systems that are later than Microsoft Windows 95. On Microsoft Windows NT, on Microsoft Windows 2000, and on Microsoft Windows Server 2003, the screen saver may run on either the default desktop or on a separate desktop, depending on a setting in the display properties:
  • If you select the On resume, password protect check box on the Screen Saver tab of the Display Properties dialog box, the screen saver runs on its own desktop.
  • If you clear the check box that is described in the previous point, the screen saver runs on the default desktop.
You cannot use either the GetForegroundWindow() function or the FindWindow function to determine whether the screen saver is currently active:
  • The GetForegroundWindow() function returns NULL because the screen saver is running on a different desktop from the desktop that the calling application is running on.
  • The FindWindow function ("WindowsScreenSaverClass", NULL) does not work either.
Therefore, Microsoft recommends the following:
  • Code to dismiss the screen saver first determines whether the screen saver is running on its own desktop.
  • If the screen saver is running on its own desktop, the code closes the screen saver there.
  • If there is no desktop for the screen saver, the code uses the default desktop.

To do this, get a handle to the screen saver's desktop, enumerate thatdesktop's windows, and then post a WM_CLOSE to the screen saver window.

The following code demonstrates how to do this. Note that if a screen saverpassword is set, the following code brings up the password dialog box,prompts the user for a password, and then actually terminates the screensaver application.
BOOL CALLBACK KillScreenSaverFunc(HWND hwnd, LPARAM lParam) { 	if(IsWindowVisible(hwnd)) 		PostMessage(hwnd, WM_CLOSE, 0, 0); 	return TRUE; } HDESK hdesk; hdesk = OpenDesktop(TEXT("Screen-saver"), 0, FALSE, DESKTOP_READOBJECTS | DESKTOP_WRITEOBJECTS); if (hdesk) { 	EnumDesktopWindows(hdesk, KillScreenSaverFunc, 0);	CloseDesktop(hdesk); } else { 	// Windows 2000 and later: 	// If there is no screen saver desktop, the screen saver 	// is on the default desktop. Close it by sending a 	// WM_CLOSE. PostMessage(GetForegroundWindow(), WM_CLOSE, 0, 0L); } 
Note that terminating a screen saver that is already running as demonstratedabove is totally separate from disabling the screen saver altogether,so that no screen saver starts after the designated time period expires.This can be done easily using:
SystemParametersInfo( SPI_SETSCREENSAVEACTIVE,                      FALSE,                      0,                      SPIF_SENDWININICHANGE                     );				
This method works well for terminating the currently running screen saver.However, one problem that you might encounter is that the system will notrestart the screen saver unless the user moves the mouse or presses a key.If you need the screen saver to start up again, you'll need to reinitializethe time-out period. Do this by using one of the following methods:
  • Using SetCursorPos() to simulate user input.
Both of these methods will cause the system to restart the time-out counterfor the screen saver.
deactivate disable stop running turn off screensaver

Article ID: 140723 - Last Review: 06/22/2014 17:59:00 - Revision: 5.0

  • kbcode kbhowto kbscreensaver KB140723