科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件用Visual C 编写完整的屏幕保护程序

用Visual C 编写完整的屏幕保护程序

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文将首先介绍屏幕保护程序的命令行格式及实现的方法,然后介绍各个相应函数。

作者:佚名 来源:blog 2007年10月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
4、 InitSaver()函数

VOID InitSaver()
{
 //检查操作系统版本
 OSVERSIONINFO osvi;
 osvi.dwOSVersionInfoSize = sizeof(osvi);
 GetVersionEx( &osvi );
 g_bIs9x = (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);

 // 在运行模式下,如果操作系统是win9x,需要载入密码验证动态链接库。
 if ( g_SaverMode == sm_full && g_bIs9x )
 {
  // 检查注册表查看屏保是否设定了密码
  HKEY hKey;
  if ( RegCreateKeyEx( HKEY_CURRENT_USER, REGSTR_PATH_SCREENSAVE, 0, NULL, 0,  KEY_READ, NULL, &hKey, NULL ) == ERROR_SUCCESS )
  {
   DWORD dwVal;
   DWORD dwSize = sizeof(dwVal);

   if ( (RegQueryValueEx( hKey, REGSTR_VALUE_USESCRPASSWORD, NULL, NULL,
(BYTE *)&dwVal, &dwSize ) == ERROR_SUCCESS) && dwVal )
   {
    g_hPasswordDLL = LoadLibrary( TEXT("PASSWORD.CPL") );
    if ( g_hPasswordDLL )
     g_VerifySaverPassword= (VERIFYPWDPROC)GetProcAddress( g_hPasswordDLL, "VerifyScreenSavePwd" );
     RegCloseKey( hKey );
   }
  }
 }

 if ( g_SaverMode == sm_full )
 {
  BOOL bUnused;
  SystemParametersInfo( SPI_SCREENSAVERRUNNING, TRUE, &bUnused, 0 ); //通知操作系统屏幕保护程序开始运行。
 }
}

  5、屏保退出函数ShutdownSaver( )和InteruptSaver( ):

VOID ShutdownSaver()
{
 // 通知操作系统屏幕保护程序退出
 if ( g_SaverMode == sm_full )
 {
  BOOL bUnused;
  SystemParametersInfo( SPI_SCREENSAVERRUNNING, FALSE, &bUnused, 0 );
 }

 if ( g_hPasswordDLL != NULL )
 {
  FreeLibrary( g_hPasswordDLL );
  g_hPasswordDLL = NULL;
 }

  PostQuitMessage( 0 );
}
/////////////////////////////////
VOID InterruptSaver()
{
 BOOL bPasswordOkay = FALSE;
 if( g_SaverMode == sm_test ||g_SaverMode == sm_full&&!g_bCheckingSaverPassword )
 {
  if( g_bIs9x && g_SaverMode == sm_full )
  {
   // Win9x下如果g_VerifySaverPassword==NULL,则没有设屏保密码。
   if ( g_VerifySaverPassword != NULL )
   {
    g_bCheckingSaverPassword = TRUE;//告诉消息响应函数正在验证密码
    bPasswordOkay = g_VerifySaverPassword( g_hWnd );
    g_bCheckingSaverPassword = FALSE; //密码验证结束。
    if ( !bPasswordOkay )
    {
     //屏保程序继续运行…
     SetCursor( NULL );
     g_dwSaverMouseMoveCount = 0;
     return;
    }
   }
  }
  ShutdownSaver();
 }
}

  屏保设置方式下的响应程序为自定义Doconfig( ),因篇幅的关系不再详细介绍,读者应当很容易自己加上,也可以定义为空函数:VOID Doconfig ( ) { return;}。

  黑屏屏幕保护程序主入口函数如下:

#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
#include <regstr.h>
#include "Saver.h"
#include "resource.h"

HINSTANCE g_hinstance;
HWND g_hWndParent;
BOOL g_bWaitForInputIdle;
HWND g_hWnd;


LRESULT CALLBACK SaverProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
 // TODO: Place code here.
 MSG msg;
 g_bCheckingSaverPassword = FALSE;
 g_bIs9x = FALSE;
 g_dwSaverMouseMoveCount = 0;
 g_hWndParent = NULL;
 g_hPasswordDLL = NULL;
 g_hWnd = NULL;
 g_VerifySaverPassword = NULL;
 g_hinstance=hInstance;

 WNDCLASS cls;
 cls.hCursor = LoadCursor( NULL, IDC_ARROW );
 cls.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(IDI_MAIN_ICON) );
 cls.lpszMenuName = NULL;
 cls.lpszClassName = TEXT("SaverWndClass");
 cls.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
 cls.hInstance = hInstance;
 cls.style = CS_VREDRAW|CS_HREDRAW;
 cls.lpfnWndProc = SaverProc;
 cls.cbWndExtra = 0;
 cls.cbClsExtra = 0;

 if(!RegisterClass( &cls ))
  MessageBox(NULL,TEXT("Cant register window class"),TEXT("SaverWndClass"),MB_ICONERROR);

 SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_IDLE );
 TCHAR* pstrCmdLine = GetCommandLine();
 g_SaverMode = ParseCommandLine(pstrCmdLine);

 switch(g_SaverMode)
 {
  case sm_preview:
  case sm_full:
  case sm_test:
  g_hWnd=CreateSaverWindow(g_SaverMode,g_hWndParent,hInstance);
  if ( g_hWnd == NULL )
  {
   MessageBox(NULL,TEXT("Can't Create Window"), TEXT("Create Window Terminated"),MB_ICONERROR);
   return 0;
  }else
  {
   ShowWindow(g_hWnd,nCmdShow);
   UpdateWindow(g_hWnd);
  }
  InitSaver();
  while(GetMessage(&msg,NULL,0,0))
  {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
  break;
 case sm_config:
  Doconfig();
  break;
 case sm_passwordchange:
  ChangePassword();
  break;
 }
 return 0;
}

  至此,黑屏屏幕保护程序代码编写完成,下一步是输入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
{
sm_config,
sm_preview,
sm_full,
sm_test,
sm_passwordchange
};

typedef BOOL (PASCAL * VERIFYPWDPROC) (HWND);

DWORD g_dwSaverMouseMoveCount;
BOOL g_bIs9x;
HINSTANCE g_hPasswordDLL;
VERIFYPWDPROC g_VerifySaverPassword;
BOOL g_bCheckingSaverPassword;
SaverMode g_SaverMode;

SaverMode ParseCommandLine( TCHAR* pstrCommandLine );
HWND CreateSaverWindow(SaverMode mode, HWND hWndParent,HINSTANCE hInstance);
VOID InitSaver();
VOID ChangePassword();
VOID Doconfig( );

  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,如果没有输入错误,即可顺利编译成功。
 

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章