以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- 用Visual C++编写完整的屏幕保护程序 (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=37882) |
-- 作者:卷积内核 -- 发布时间:9/13/2006 11:01:00 AM -- 用Visual C++编写完整的屏幕保护程序 屏幕保护程序是一个Win32应用程序,与一般的Win32应用程序不同之处在于:1、扩展名要求为 SCR ;2、命令行要有一定的格式,以便操作系统向其传递信息,如 运行模式,父窗口句柄(Handle to Parent Window)等 ;3、其他一些消息相应方面的要求。本文将首先介绍屏幕保护程序的命令行格式及实现的方法,然后介绍各个相应函数,并通过Window主函数WinMin()勾画出屏幕保护程序的主框架,最后介绍编译步骤和注意事项 屏幕保护程序的命令行格式 :文件名 \ [运行模式] \[窗口句柄]。 其中运行模式有五种选择: 1. “运行模式”= ‘c’ 或 ‘C ’, 句柄为一串数字, 或文件名后没有任何参数。 屏保程序设置方式,Window 显示属性_屏幕保护程序_设置按钮调用,数字为调用函数的窗口句柄(Handle to Parent Window)(十进制),如果没有数字,句柄为NULL。 2. “运行模式”=‘t’或‘T’。 测试方式,忽略句柄数字。 3. “运行模式”=‘p’或‘P’。 预览方式,Window 显示属性_屏幕保护程序_预览按钮调用,句柄为调用函数的窗口句柄。 4. “运行模式”=‘a’或‘A’。 密码设置方式, Window 显示属性_屏幕保护程序_密码保护_更改按钮调用。句柄为调用函数的Window 句柄。 5. 其它(通常“运行模式”=‘s’) 屏幕保护程序正常运行模式。 因此,编写屏幕保护程序的首要任务是过滤命令行,提取对应的系统调用方式和其他信息,本文用自定义函数ParseCommandline( )实现: //用enum定义五种调用方式: //命令行过滤函数,命令行获得函数是用API GetCommandLine( )。 // 跳过长文件名中的路径和空格。 // 跳过"/" 或 "-" // 如果没有任何参数,为设置模式。 // 如果有参数,查看参数内容。 case 't': case 'p': case 'a': default: ParseCommandLine( ) 返回后,程序根据不同的返回值进行响应: 返回值=sm_preview或者sm_test 或者sm_full: 程序根据返回的运行模式和Window句柄使用CreateWindow函数创建窗口(Window)并返回指向该窗口的句柄。这部分功能包含在自定义的CreateSaverWindow()函数中。在sm_preview情况下,程序用消息循环的方式等待500ms使操作系统的控制面板有足够的时间初始化。然后,读注册表检查屏保是否设定了密码,如果是,在Win9x情况下,用LoadLibrary()和GetProcessAdress()函数从动态链接库(DLL)中获得密码验证函数指针供程序退出时使用,密码验证函数类型为BOOL PASCAL (HWND)。这部分功能包含在自定义函数InitSaver()中。 以上窗口创建使用同一个窗口类(Window Class(WNDCLASS)),当然也是同一个消息响应函数(Window’s Procedure)。最后显示窗口,开始消息循环。 返回值=sm_passwordchange: 用LoadLibrary()和 GetProcessAdress()API获得密码设置函数指针,密码设置函数类型为:DOWORD PASCAL ( LPCSTR, HWND, DWORD, LPVOID ),然后调用该函数进行密码更改。 返回值=sm_config 显示一个对话框(Dialog),获取用户信息,在程序中进行相应的更改。 |
-- 作者:卷积内核 -- 发布时间:9/13/2006 11:02:00 AM -- 屏幕保护程序的退出机制反映在程序的消息响应函数(Window’s Procedure)中,当按下键盘上任何一个健或者鼠标移动计数超过5次(防止桌面振动等因素导致的鼠标移动),程序进入退出机制,在sm_test或者sm--_full情况下查看屏幕保护程序是否设置密码,如果是,验证密码,正确,程序退出,错误,程序继续。当程序验证密码时,通过全局变量g_bCheckingSaverPassword告诉消息响应函数对屏幕刷新,以保证密码的输入。其他情况(sm_config, sm_preview)不用验证密码直接退出。这些功能包括在自定义的函数InterruptSaver( )和ShutdownSaver( )中。 上述各个函数的详细代码如下: 1、 CreateSaverWindow 函数: HWND CreateSaverWindow(SaverMode mode, HWND hWndParent,HINSTANCE hInstance) hWnd=NULL; switch ( mode ) case sm_test: case sm_full: hWnd = CreateWindowEx( WS_EX_TOPMOST, TEXT("SaverWndClass"), } MSG msg; while( g_bWaitForInputIdle ) TranslateMessage( &msg); 2、 Window消息响应函数: LRESULT CALLBACK SaverProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) case WM_DESTROY: case WM_SETCURSOR: case WM_PAINT: RECT rc; EndPaint( hWnd, &ps ); case WM_ERASEBKGND: case WM_MOUSEMOVE: case WM_KEYDOWN: case WM_ACTIVATEAPP: case WM_POWERBROADCAST: case WM_SYSCOMMAND: return DefWindowProc( hWnd, uMsg, wParam, lParam ); 3、 ChangePassword()函数 VOID ChangePassword() if ( mpr != NULL ) //运行密码设置函数 //释放动态链接库 |
-- 作者:卷积内核 -- 发布时间:9/13/2006 11:03:00 AM -- 4、 InitSaver()函数 VOID InitSaver() // 在运行模式下,如果操作系统是win9x,需要载入密码验证动态链接库。 if ( (RegQueryValueEx( hKey, REGSTR_VALUE_USESCRPASSWORD, NULL, NULL, if ( g_SaverMode == sm_full ) 5、屏保退出函数ShutdownSaver( )和InteruptSaver( ): VOID ShutdownSaver() if ( g_hPasswordDLL != NULL ) PostQuitMessage( 0 ); 屏保设置方式下的响应程序为自定义Doconfig( ),因篇幅的关系不再详细介绍,读者应当很容易自己加上,也可以定义为空函数:VOID Doconfig ( ) { return;}。 黑屏屏幕保护程序主入口函数如下: #include <windows.h> HINSTANCE g_hinstance; int APIENTRY WinMain(HINSTANCE hInstance, WNDCLASS cls; if(!RegisterClass( &cls )) SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_IDLE ); switch(g_SaverMode) 至此,黑屏屏幕保护程序代码编写完成,下一步是输入VC++6.0 并进行编译,具体步骤如下: 1、 打开VC++ 6.0, 从文件菜单中选择 New, 选中工程(Project)窗口,从窗口中选中Win32 Application项,在右侧的Locatioon(工程文件保存位置)填入位置信息(如填D\ScreenSaver),在其上边的Project name(工程名)栏中填入适当的名称(如Saver),按OK按钮,这时出现新的窗口,有三个选项,选择 A Simple Apllication, 按Finish(完成)健,接下来出现确认窗口,按OK,完成初步Win32 Application工程的创建。 2、 在ClassView窗口的Globles项下找到WinMain函数,双击鼠标打开C++文件(本文为Saver.cpp),按照前面的各条程序输入相应内容。 3、 选择FileView窗口选项,从主窗口文件菜单中选择New,选择File(文件),从文件类型中选择C\C++ Header File,输入文件名(最好与工程名同名,如Saver),确认后,新的头文件出现在FileView窗口Header Files项下(本文文件名为Saver.h)。 双击新创建的头文件(Saver.h),在头文件中输入以上函数和全局变量的说明(Declaration): enum SaverMode typedef BOOL (PASCAL * VERIFYPWDPROC) (HWND); DWORD g_dwSaverMouseMoveCount; SaverMode ParseCommandLine( TCHAR* pstrCommandLine ); 4、 确保在C++主文件中包含头文件,即在主文件(Saver.cpp)中,包含#include <Saver.h>语句。 5、 在插入(Insert)菜单中选择资源(Resource),在随后出现的菜单中选择资源类型为图标(Icon),按新建按钮,这时,空白图标出现在右边窗口,对其进行编辑后,用鼠标选定该图标,从查看菜单中打开属性窗口(Properties),将该图标的ID 改为IDI_MAIN_ICON,按保存按钮,这时出现窗口,要求选择Resource Script文件名,填入适当的文件名(本文填Saver),按OK健,这时,工程目录中应当出现以rc为扩展名的文件。选择FileView窗口,选择Resource Files项,按鼠标右健,选择Add Files to Folder…项,将Resource.h和新建立的Saver.rc文件加入Resource项下。这时,出现ResourceView窗口选项,从该窗口中可以查看本工程的资源(Resource)情况。 6、 在工程菜单中,选择设置(Settings…), 在Setting for栏目中分别选择Win32 Release和Win32 Debug项,在右边的Link窗口中,将Output File Name中的文件名从exe扩展名改为scr扩展名。 这时,完成编译环境的设置和输入工作,从编译菜单中选Build,如果没有输入错误,即可顺利编译成功 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
62.500ms |