您的位置: 首页 > 软件教程 > C++ Builder教程专题 > C++Builder开发Windows下的屏保

C++Builder开发Windows下的屏保

9.0分
出处:网络 时间:2011-06-27

您可能感兴趣的话题: C++ Builder  

核心提示:视窗系统下的屏幕保护程序是一个基于命令行(Command Line)的应用程序

  一。 引言
  视窗系统下的屏幕保护程序是一个基于命令行(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目录下就可以测试了。如果一切正常的话你将会看
  到图片在屏幕上以随机的位置显示。
  三。 源代码
  以下是本程序的所有的源代码,其中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|WS_CHILD;
          SetWindowLong(Application->MainForm->Handle,GWL_STYLE,style);//设置窗口为子窗口
          SetParent(Application->MainForm->Handle,CPWindow);//设置屏保预览窗口为FrmControl的父窗口
          GetClientRect(CPWindow,lookrect);//获取屏保预览窗口的客户区
          SetWindowPos(Application->MainForm->Handle,HWND_TOP,0,0,lookrect->right,lookrect->bottom ,SW
  P_NOZORDER|SWP_NOACTIVATE|SWP_SHOWWINDOW);//将FrmControl的窗口覆盖屏保预览窗口的客户区,并显示它
          }
         else if(StartType=="/a")//启动密码设置窗口
          {
          temp=Command.SubString(3,Command.Length()-2);
          CPWindow =(long *)temp.ToInt();//以下是动态调用mpr.dll里的PwdChangePasswordA函数的过程
          typedef UINT(CALLBACK *FUN)(LPSTR,HWND,UINT,UINT);
          HINSTANCE hDll=LoadLibrary("mpr.DLL");
          FUN myfun;
          if(hDll!=NULL)
           {
           myfun=(FUN)GetProcAddress(hDll,"PwdChangePasswordA");
           if(!myfun)FreeLibrary(hDll);
           else
           myfun("SCRSAVE", CPWindow, 0, 0);//函数的调用
           }
          }
         Application->Run();
  }
  catch (Exception &exception)
  {
         Application->ShowException(&exception);
  }
  return 0;
  }
  //---------------------------------------------------------------------------/
  /*{*******************************}*/
  /*{*****  Unitmain.h   ****}*/
  /*{*******************************}*/
  //---------------------------------------------------------------------------/
  #ifndef UnitmainH
  #define UnitmainH
  //---------------------------------------------------------------------------/
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  //---------------------------------------------------------------------------/
  class TFrmmain : public TForm
  {
  __published: // IDE-managed Components
  TTimer *Timer1;
  TImage *Image1;
  void __fastcall FormCreate(TObject *Sender);
  void __fastcall FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift);
  void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y);
  void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
  void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
  void __fastcall Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y);
  void __fastcall Image1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y);
  void __fastcall Timer1Timer(TObject *Sender);
  private: // User declarations
  DWORD PWProtect;
  DWORD Version;
  String picdir;
  int frequence;
  public: // User declarations
  __fastcall TFrmmain(TComponent* Owner);
  };
  //---------------------------------------------------------------------------/
  extern PACKAGE TFrmmain *Frmmain;
  //---------------------------------------------------------------------------/
  #endif
  //---------------------------------------------------------------------------/
  /*{*******************************}*/
  /*{***** Unitmain.cpp  ****}*/
  /*{*******************************}*/
  //---------------------------------------------------------------------------/
  #include
  #pragma hdrstop
  #include
  #include "Unitmain.h"
  #include
  //---------------------------------------------------------------------------/
  #pragma package(smart_init)
  #pragma resource "*.dfm"
  TFrmmain *Frmmain;
  //---------------------------------------------------------------------------/
  __fastcall TFrmmain::TFrmmain(TComponent* Owner)
  : TForm(Owner)
  {
  }
  //---------------------------------------------------------------------------/
  void __fastcall TFrmmain::FormCreate(TObject *Sender)
  {
  //使窗口成为最顶层的窗口
  SetWindowPos(this->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
  //时窗口覆盖屏幕
  this->Width=Screen->Width;
  this->Height=Screen->Height;
  this->Top=0;
  this->Left=0;
  Version=GetVersion();
  TRegistry *Registry = new TRegistry;
  try
  {
  if(Version>0x80000000){
  Registry->RootKey =HKEY_CURRENT_USER;
  Registry->OpenKey("\Control Panel\Desktop",false);
  PWProtect=Registry->ReadInteger("ScreenSaveUsePassword");//检测是否密码保护
  Registry->CloseKey();}
  Registry->RootKey =HKEY_CURRENT_USER;
  Registry->OpenKey("\Software\CODEHUNTER", true);
  picdir=Registry->ReadString("PicDir");//得到图片目录
  frequence=Registry->ReadInteger("frequence");//得到图像显示的频率
  if(picdir=="")picdir="no";
  if(frequence<0||frequence>6) frequence=2;
  Timer1->Interval=1000*frequence;设置定时器
  }

网友评论
精品软件课程
更多 >
C++是一种静态数据类型检查的,支持多重编程... [详细]
Java,是由Sun Microsystem... [详细]
C语言是一种面向过程的计算机程序设计语言。多... [详细]
Visual Basic是一种由微软公司开发... [详细]
Oracle Database,又名Orac... [详细]
Visual Basic.NET是从 Vis... [详细]