支持屏幕保护程序窗口过程

【勇芳软件工作室】汉化HomePreviousNext

每个屏幕保护程序必须支持名为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);

}