每个屏幕保护程序必须支持名为ScreenSaverProc的窗口过程。像大多数窗口过程一样,ScreenSaverProc处理一组特定消息,并将任何未处理的消息传递到默认过程。但是,DefWindowProc函数不会将它们传递给DefWindowProc函数,而是将未处理的消息传递给DefScreenSaverProc函数。ScreenSaverProc与正常窗口过程之间的另一个区别是传递给ScreenSaverProc的句柄标识整个桌面而不是客户端窗口。以下示例显示示例屏幕保护程序的ScreenSaverProc窗口过程。
LONG WINAPI ScreenSaverProc(hwnd,message,wParam,lParam)
HWND hwnd;
UINT message;
DWORD wParam;
LONG lParam;
{
static HDC hdc; /* device-context handle */
static RECT rc; /* RECT structure */
static UINT uTimer; /* timer identifier */
开关(消息)
{
case WM_CREATE:
/ *从.RC文件中检索应用程序名称。*/
LoadString(hMainInstance, idsAppName, szAppName, 40);
/ *检索.INI(或注册表)文件名。*/
LoadString(hMainInstance,idsIniFile,szIniFile,
MAXFILELEN);
/ *从注册表检索任何重绘数据。*/
lSpeed = GetPrivateProfileInt(szAppName, szRedrawSpeed,
DEFVEL, szIniFile);
/*
*设置屏幕保护程序窗口的计时器
*重绘率存储在REGEDIT.INI中。
*/
uTimer = SetTimer(hwnd, 1, lSpeed * 1000, NULL);
break;
case WM_ERASEBKGND:
/*
* WM_ERASEBKGND消息在之前发出
* WM_TIMER消息,允许屏幕保护程序
*酌情涂上背景。
*/
hdc = GetDC(hwnd);
GetClientRect (hwnd, &rc);
FillRect (hdc, &rc, GetStockObject(BLACK_BRUSH));
ReleaseDC(hwnd,hdc);
break;
case WM_TIMER:
/*
* WM_TIMER消息以(lSpeed * 1000)发出
* intervals, where lSpeed == .001 seconds. This
*代码重绘整个桌面与一个白色,
*浅灰色,深灰色或黑色刷
*发送WM_TIMER消息的时间。
*/
hdc = GetDC(hwnd);
GetClientRect(hwnd, &rc);
if (i++ <= 4)
FillRect(hdc, &rc, GetStockObject(i));
其他
(i = 0);
ReleaseDC(hwnd,hdc);
break;
case WM_DESTROY:
/*
*当发出WM_DESTROY消息时,屏幕保护程序
*必须销毁任何在WM_CREATE设置的定时器
* 时间。
*/
如果(uTimer)
KillTimer(hwnd, uTimer);
break;
}
/*
* DefScreenSaverProc处理任何消息
* ScreenSaverProc忽略。
*/
return DefScreenSaverProc(hwnd, message, wParam, lParam);
}