E_Mail:codehunter@sohu.com 网址:http://codehunter.1yes.net 摘要:本文通过一个具体的程序演示了Windows下的屏幕保护程序的实现过程。 一. 引言 视窗系统下的屏幕保护程序是一个基于命令行(Command Line)的应用程序。当屏保 程序被调用时操作系统就用具体的命令行执行该程序。本文组织和处理了所有的命令行,包 括“/p”,“/s”,“/c”,“/a”,其中“/p”表示让屏保在预览窗口中显示;“/s”表示真正运行 屏保;“/c”表示调用设置对话框;而“/a”表示调用密码设置对话框(WinNT中无效)。本 程序尽可能简单地实现一个全功能的屏保,运行Windows的屏保设置程序时你既可以修改 密码(WinNT中无效)又可以设置图片显示的频率并把频率数值保存到注册表里。当屏保 运行时图片以你设置的频率改变显示位置。笔者还留了个作业给读者,请看图1中的选择图 片文件夹这个项目,按下浏览按钮可以设置图片的路径,笔者已经实现了浏览按钮的功能并 把得到的路径也保存到注册表中,并让屏保启动时读picdir的值,picdir等于"no"时的代码 笔者已实现了,picdir不等于"no"时的代码由读者实现。也就是让读者实现一个能把picdir 目录里的图片轮流显示的屏保程序。
二. 实现方法 首先介绍几个API函数。 WinMain函数: int WINAPI WinMain( HINSTANCE hInstance, // 当前实例句柄 HINSTANCE hPrevInstance, // 前一个实例句柄 LPSTR lpCmdLine, // 指向命令行参数的指针(本程序要利用的参数) int nCmdShow // 窗口的状态 ); GetWindowLong函数:得到指定窗口信息的函数 LONG GetWindowLong( HWND hWnd, //窗口句柄 int nIndex //指定返回的信息 ); SetWindowLong函数:改变窗口属性 LONG SetWindowLong( HWND hWnd, //窗口句柄 int nIndex, // 指定要设定的值的信息 LONG dwNewLong // 新值 ); SetParent函数:改变指定窗口的父窗口 HWND SetParent( HWND hWndChild, //要改变父窗体的窗口句柄 HWND hWndNewParent //新的父窗体的句柄 ); GetClientRect函数:得到窗口的客户区 BOOL GetClientRect( HWND hWnd, // 窗口句柄 LPRECT lpRect //RECT结构的地址 ); SetWindowPos函数:改变窗口的大小,位置,顶级窗口等 BOOL SetWindowPos( HWND hWnd, // 窗口句柄 HWND hWndInsertAfter, // 布置窗口顺序的句柄(Z order) int X, // horizontal position int Y, // vertical position int cx, // width int cy, // height UINT uFlags // 窗口位置等标记 ); SystemParametersInfo函数:访问或设置系统级的参数 BOOL SystemParametersInfo( UINT uiAction, // 指定要获取或设置的系统参数 UINT uiParam, // depends on action to be taken PVOID pvParam, // depends on action to be taken UINT fWinIni // 用户配置文件是否改变标记 ); ShowCursor函数:显示或隐藏光标 int ShowCursor( BOOL bShow // 鼠标可见度标记 ); GetVersion函数:获取系统的版本信息 DWORD GetVersion(VOID)
以上API函数的具体信息可以查找有关MSSDK文档。了解了基本函数后笔者简述一 下实现方法。 1. 新建一工程,增加两个窗体,将三个窗体分别取名为MainForm,FrmConfig, FrmControl。在MainForm和FrmControl窗体上各添加一个Timer控件和TImage控件, 把两窗体的BorderStyle设为bsNone,背景色设为黑色。在两个窗体的TImage上各加一 张图片,FrmControl大小设为:高130像素,宽160像素,Timage的Stretch属性设为真 值。FrmConfig的样式如图1。 2. 保存工程文件为screensaver.cpp,其它单元分别存为Unitmain.cpp, Unitcontrol.cpp,Unitconfig.cpp。 3. 编写代码,具体代码见第三部分的源程序。 4. 编译成可执行文件,并把文件扩展名改为scr。 5. 最后把屏保程序拷贝到windows目录下就可以测试了。如果一切正常的话你将会看 到图片在屏幕上以随机的位置显示。 图1 三. 源代码 以下是本程序的所有的源代码,其中screensaver.cpp, Unitmain.cpp是核心代码。 /*{*******************************}*/ /*{***** screensaver.cpp ****}*/ /*{*******************************}*/ //--------------------------------------------------------------------------- #include #pragma hdrstop USERES("screensaver.res"); USEFORM("Unitmain.cpp", Frmmain); USEFORM("Unitconfig.cpp", FrmConfig); USEFORM("Unitcontrol.cpp", FrmControl); //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR p, int)//“p"是指向命令行参数的指针 { String StartType; AnsiString Command=p,temp; HWND CPWindow =NULL; if(Command=="") StartType = "/c"; else StartType=Command.SubString(1,2);//获取命令行的前两个参数 try { Application->Initialize(); if(StartType=="/c")//启动设置窗口 Application->CreateForm(__classid(TFrmConfig), &FrmConfig); else if(StartType=="/s")启动屏保 Application->CreateForm(__classid(TFrmmain), &Frmmain); else if(StartType=="/p")//预览 { Application->CreateForm(__classid(TFrmControl), &FrmControl); temp=Command.SubString(3,Command.Length()-2);//获取命令行中的屏保预览窗 口句柄的字符串形式 CPWindow =(long *)temp.ToInt();//将预览窗口句柄的字符串形式强制转换为长整形 指针
RECT *lookrect;//建立一个RECT结构指针 Long style=GetWindowLong(Application->MainForm->Handle,GWL_STYLE);//获 取FrmControl窗口的风格 style=style |