自助屏保餐



屏保是什么?就是在屏幕长时间空闲时显示一些活动的画面,避免显示器局部长时间受辉光照耀,至于显示一些什么东西,就让你自由发挥了。
可是,在那里值得显示些什么东西呢?难道你有呆呆地看屏保的习惯?那还不如去看 MPEG呢。
况且我又不上电视,没必要放一个屏保在身后,对着镜头侃侃而谈。
所以,我从来都是设定“黑屏”为我的屏幕保护程序。
但是,有时我出去逛了一圈,回来后我希望能知道我是什么时候出去的,所以很想屏幕保护程序能记录下时间。
当我能够做“自助屏保餐”时,我的愿望实现了!
很简单!利用SCRNSAVE.LIB,你只要搭一个框架,再填写显示输出模块,具体的消息控制就交给它了。我用的是Visual Studio 6.0,在VC98\LIB目录下面有,希望你也能找到。
先看看WIN32的屏保机制:在规定时间内没有键盘和鼠标输入,则产生 wParam= =SC_SCREENSAVE的WM_SYSCOMMAND消息。如果该消息没有被当前活动程序截获(放VCD软件就是这样阻止屏保的运行,此是后话),那么DefWindowProc将按照 SYSTEM.INI的[boot]区的描述来执行屏幕保护程序。通过SCRNSAVE.LIB,你的程序ScreenSaverProc将接收到的消息有:
WM_CREATE
当然是初始化了。
WM_ERASEBKGND
擦除背景。这个我们不用理会,留给标准程序工作吧。
WM_DESTROY
结束。
那么,我们该做什么呢?好说,在初始化时加个定时器TIMMER,不就有事干了吗?
好了,打开VC吧,我们来开始干活。注意看蓝色的注释。
第一步,选择New--Project,用Win32 Application。输入名字,下一步选择“A typical helloworld application.” 其他都缺省了。
第二步,把下面程序拷贝过去,覆盖掉原来的MySaver.CPP。

#include "stdafx.h"
#include < windows.h>
#include < scrnsave.h>
#include < time.h>
#include "resource.h"

LRESULT    WINAPI ScreenSaverProc(HWND, UINT, WPARAM, LPARAM);
BOOL    WINAPI    ScreenSaverConfigureDialog(HWND, UINT, WPARAM, LPARAM);
BOOL    WINAPI    RegisterDialogClasses(HANDLE );
//*/
LRESULT    WINAPI ScreenSaverProc(HWND hWnd, 
                UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;    RECT rc;
    static int xpos;    //横坐标
    static int ypos;    //纵坐标
    static char SlideText[] = "我喜欢独裁,不让你碰我的计算机。";
    static UINT Timer;    //定时器
    static char tmpbuf[32];
    switch (message)
    {
    case    WM_CREATE:    //初始化
        xpos = 0;
        Timer = SetTimer(hWnd, 1, 500, NULL);    //0.5秒动作一次。
        _strtime( tmpbuf );
        tmpbuf[8] = '-';
        break;
    case    WM_ERASEBKGND:
        break;    //留给DefScreenSaveProc处理
    case    WM_TIMER:        //动画显示的效果就在这里。
        hDC = GetDC( hWnd );
        GetClientRect( hWnd, &rc );
        FillRect( hDC, &rc, (HBRUSH) GetStockObject(BLACK_BRUSH) ); //输出文本
        SetTextColor( hDC, RGB( 255*rand(), 255*rand(), 255*rand() ) );
        SetBkColor( hDC, RGB( 0,0,0 ) );
        TextOut( hDC, xpos - strlen(SlideText)*8, ypos, 
            SlideText, strlen(SlideText) );    //移动文本1的横坐标.
        _strtime( tmpbuf+9 );
        TextOut( hDC, GetSystemMetrics(SM_CXSCREEN) - xpos, ypos, 
            tmpbuf, strlen(tmpbuf) );    //移动文本2的横坐标.

        xpos = ( xpos + 10 ) % ( GetSystemMetrics(SM_CXSCREEN) 
			+ strlen(SlideText)*8 );
        ypos = ( ypos + 10 ) % GetSystemMetrics(SM_CYSCREEN);
        ReleaseDC( hWnd, hDC );
        break;
    case WM_DESTROY:
        KillTimer( hWnd, Timer );
        PostQuitMessage( 0 );
        return 0;
    }
    return DefScreenSaverProc( hWnd, message, wParam, lParam);
		//剩下的消息由此处理.
}

BOOL    WINAPI    ScreenSaverConfigureDialog(HWND HwND, 
            UINT message, WPARAM wParam, LPARAM lParam)
{    //暂时不配置对话框,可自行添加.
    return FALSE;
}

BOOL    WINAPI    RegisterDialogClasses (HANDLE  hInstance)
{    //一般不需要.
    return TRUE;
}
第三步,画出一个图标MySaver.ico,其ID为ID_APP。在String Table中加入ID为 IDS_DESCRIPTION,Captain为MySaver的字符串。
第四,在Project菜单的Setting—Link中加入SCRNSAVE.LIB,编译。
最后,把生成的MySaver.EXE改名成MySaver.SCR,就可以执行了。拷到Windows目录,在显示器的屏保就可以选择它。
显示的结果?两个时间:起始时间和当前时间,在屏幕上不断走动。如果你懒得做一遍, 拷下来好了!
最后,提醒一句:屏保不光可以保护显示器,还可以保护你的计算机不被别人乱动。加个好口令非常应该。把它放到“开始” (Start...) 的菜单里,暂时离开计算机时执行它,是很必要的。
Copyright 1998-2002 Fadshop.net, Inc. All rights reserved. jhj123@163.net