AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

实现真正的Windows屏幕保护程序

51自学网 2015-08-30 http://www.wanshiok.com

屏幕保护程序是一种特殊的应用程序,如果用户打开了Windows的屏幕保护功能,而且在一特定的时间段内没有任何输入,系统就回自动启动屏幕保护程序。屏幕保护程序有两个作用:

1.防止屏幕长时间显示静态图象而降低荧光介质的寿命。

2.防止用户离开计算机时屏幕上的信息被不相干的人看到。

相应的,屏幕保护程序至少应该实现以下两个功能:

1.动画功能:显示动态的图象。

2.密码校验功能:退出程序时屏蔽一切系统热键(Ctrl+Alt+Del,Alt+Tab,Ctrl+Esc 等,避免用户使用热键关闭程序或切换到其它程序而跳过密码校验),并要求输入授权密码。

我们可以找到不少介绍Windows屏幕保护程序的资料,也可以找到许多制作屏幕保护程序的工具。然而,由于不清楚Windows屏幕保护程序的密码校验功能,所以它们实现的往往只是动画功能,而没有提供密码校验功能。

实际上,Visual C++已经为我们准备好了一个屏幕保护库,使用它,我们可以非常容易的实现Windows屏幕保护程序的一切功能。



介绍Windows屏幕保护库

Windows屏幕保护库为我们提供了

1.WinMain ( )函数:完成程序初始化和消息调度。看到这里,可能有些读者已经想到了:我们不能在MFC中使用Windows屏幕保护库。为什么呢?原因很简单:MFC的底层封装了WinMain( )函数,如果在MFC中使用Windows屏幕保护库,一个程序中就会有两个WinMain( )函数,显然说不过去。因此,我们只有使用Win32 SDK了。

2.DefScreenSaverProc ( )函数:处理键盘、鼠标等消息,实现屏蔽热键及密码校验等功能。

3.一些函数、变量和常量的定义。

大家可以在Visual C++安装目录的Include子目录中找到SCRNSAVE.H文件,通过它,我们可以看到它们具体的定义。

当系统启动一个屏幕保护程序时,WinMain( )函数首先判断系统传递的命令行参数。如果参数指示设置屏幕保护程序,那么WinMain( )函数将会用函数

BOOL WINAPI ScreenSaverConfigureDialog (HWND hDlg,

UINT message,

WPARAM wParam,

LPARAM lParam

);

来创建设置对话框并将用户的输入保存到注册表中,还会用函数

BOOL WINAPI RegisterDialogClasses (HANDLE hInst)来注册设置对话框中的特殊窗口类或自定义控件类,如果没有特殊窗口类和自定义控件类,RegisterDialogClasses( )函数只需简单的返回TRUE值。如果参数指示运行屏幕保护程序,WinMain( )函数会调用一些初始化代码来注册窗口类并建立一个全屏窗口。而发送给屏幕保护程序的消息则由函数

LRESULT WINAPI ScreenSaverProc ( HWND hWnd,

UINT message,

WPARAM wParam,

LPARAM lParam

);

处理。我们可以在ScreenSaverProc( )函数中处理下面几个消息(当然也可以处理其它消息):

WM_CREATE 从注册表中获取屏幕保护程序的设置信息

创建一个计时器

处理其它的初始化工作

WM_TIMER 处理绘制工作

WM_DESTORY 销毁计时器

处理其它销毁工作

ScreenSaverProc( )函数未处理的消息则传递给DefScreenSaverProc( )处理。从这里我们可以看出,我们所要做的只是实现ScreenSaverProc( ),ScreenSaverConfigureDialog( )和

RegisterDialogClasses( )三个函数,而麻烦的密码校验和密码更改已经由DefScreenSaverProc( )函数实现了!剩下的就是编译并与Windows屏幕保护程序库连接了。

必须注意的是,Windows屏幕保护程序库对资源ID有一些特殊的要求。首先,它要求有一个ID为IDS_DESCRIPTION(定义为#define IDS_DESCRIPTION 1,见Visual C++目录的Include/SCRNSAVE.H文件),长度小于25的字符串资源,这个字符串将显示在桌面属性对话框屏幕保护程序列表框中。另一个要求是屏幕保护程序的设置对话框的ID必须为DLG_SCRNSAVECONFIGURE(定义为#define DLG_SCRNSAVECONFIGURE 2003)。

下面我们来看一个屏幕保护程序框架的源程序:

(笔者的开发环境为Windows 98和Visual C++ 6.0,由于笔者没有Windows NT,故未考虑Windows NT下的情况。)



屏幕保护程序框架的源程序

/////////////////////// 主程序 ///////////////////////

#include "windows.h"

#include "resource.h"

#include "ScrnSave.h"



LRESULT CALLBACK ScreenSaverProc(HWND hWnd,

UINT message,

WPARAM wParam,

LPARAM lParam

)

{

switch (message)

{

case WM_CREATE:

// 从注册表中获取屏幕保护程序的设置信息

// 创建一个计时器

// 处理其它的初始化工作

return TRUE;

case WM_TIMER:

// 处理绘制工作

return TRUE;

case WM_DESTORY:

// 销毁计时器

// 处理其它销毁工作

return TRUE;

default:

return DefScreenSaverProc(hWnd, message, wParam, lParam);

}

return FALSE;

}

<

 

 

 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
上一篇:如何创建无模式对话框  下一篇:在Windows95/98中实现苹果窗口界面