當前位置:吉日网官网 - 紀念幣收藏 - C++Builder開發Windows下的屏幕保護程序

C++Builder開發Windows下的屏幕保護程序

壹個。介紹

Windows系統下的屏幕保護程序是基於命令行的應用程序。當調用屏保時,操作系統用特定的命令行執行程序。本文組織處理了所有的命令行,包括“/p”、“/s”、“/c”和“/a”,其中“/p”表示在預覽窗口顯示屏保;"/s "表示運行屏幕保護程序;“/c”表示調用設置對話框;而“/a”表示調用密碼設置對話框(在WinNT中無效)。這個程序盡可能簡單的實現了壹個全功能的屏保。運行Windows屏保安裝程序時,不僅可以修改密碼(在WinNT中無效),還可以設置圖片顯示的頻率,並將頻率值保存在註冊表中。當屏幕保護程序運行時,圖像會以您設置的頻率改變其顯示位置。我還給讀者留了壹個作業。請看圖1中選擇圖片文件夾的項目。按瀏覽按鈕設置圖片的路徑。作者實現了瀏覽按鈕的功能

保存註冊表的路徑,讓屏保啟動時讀取picdir的值。picdir等於“否”時的代碼已被作者實現,picdir不等於“否”時的代碼已被讀者實現。也就是說,讓讀者實現壹個可以依次顯示picdir目錄中圖片的屏保。

兩個。實現方法

首先,介紹幾個API函數。

WinMain函數:

int winapi winmain(hinstanceh instance,//當前實例句柄。

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 // new/)的父窗體的句柄;

GetClientRect函數:獲取窗口的客戶區。

BOOL GetClientRect(HWND hWnd,//窗口句柄。

LPRECT lpRect //RECT/結構的地址);

SetWindowPos函數:改變大小、位置、頂層窗口等。的窗戶。

Boolsettwindowpos (hwnd hwnd,//窗口句柄。

Hwnd hwnd inserter,//句柄來排列窗口順序(Z順序)

int X,//水平位置

int Y,//垂直位置

int cx,// width

int cy,// height

uintlags//窗口位置等標簽);

SystemParametersInfo函數:訪問或設置系統級參數。

boolsystemaparametersinfo(uintuaction,//指定要獲取或設置的系統參數。

UINT uiParam,//取決於要采取的操作

PVOID pvParam,//取決於要采取的操作

uint fwini//用戶配置文件是否更改標誌);

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屬性設置為true值。FrmConfig的樣式如圖1所示。

2.將項目文件保存為screensaver.cpp,其他單位保存為Unitmain.cpp,

Unitcontrol.cpp,Unitconfig.cpp。

3.寫代碼。具體代碼見第三部分源程序。

4.將其編譯成可執行文件,並將文件擴展名改為scr。

5.最後,將屏幕保護程序復制到windows目錄中進行測試。如果壹切正常,妳就看著吧。

直到畫面顯示在屏幕上的任意位置。

三個。源代碼

以下是這個程序的全部源代碼,其中screensaver.cpp和Unitmain.cpp是核心代碼。

/*{*******************************}*/

/*{***** screensaver.cpp ****}*/

/*{*******************************}*/

// - /

#包括

#pragma hdrstop

USERES(" screen saver . RES ");

USEFORM("Unitmain.cpp ",Frmmain);

USEFORM("Unitconfig.cpp ",frm config);

USEFORM("Unitcontrol.cpp ",frm control);

// - /

Winapi winmain (hinstance,hinstance,lpstr p,int)//“p”是指向命令行參數的指針。

{ String StartType

AnsiString Command = p,temp

HWND CPWindow = NULL

if(Command== " ")

StartType = "/c ";

其他

StartType =命令。子串(1,2);//獲取命令行的前兩個參數

嘗試

{

應用程序初始化();

If(StartType=="/c")//啟動設置窗口。

application-create form(_ _ classid(TFrmConfig),frm config);

Else if(StartType=="/s ")啟動屏幕保護程序。

application-create form(_ _ classid(TFrmmain),Frmmain);

Else if(StartType=="/p")//預覽

{

application-create form(_ _ classid(tfrm control),frm control);

temp =命令。子串(3,命令。長度()-2);//獲取命令行中屏幕保護程序預覽窗口句柄的字符串形式。

CPWindow =(long *)溫度。ToInt();//將預覽窗口句柄的字符串形式強制轉換為長整型指針。

RECT * look rect;//創建RECT結構指針。

long STYLE = GetWindowLong(Application-MainForm-Handle,GWL _ STYLE);//獲取FrmControl窗口的樣式。

style = style | WS _ CHILD

SetWindowLong(應用程序-主窗體-句柄,GWL _樣式,樣式);//將窗口設置為子窗口

SetParent(應用程序-主窗體-句柄,CP window);//將屏保預覽窗口設置為FrmControl的父窗口。

GetClientRect(CPWindow,lookrect);//獲取屏保預覽窗口的客戶區。

SetWindowPos(Application-main form-Handle,HWND_TOP,0,0,lookrect-right,lookrect-bottom,SW

p _ no zorder | SWP _ no activate | SWP _ show window);//將FrmControl的窗口疊加在屏保預覽窗口的工作區上並顯示。

}

Else if(StartType=="/a")//啟動密碼設置窗口。

{

temp =命令。子串(3,命令。長度()-2);

CPWindow =(long *)溫度。ToInt();//下面是mpr.dll動態調用PwdChangePasswordA函數的過程。

typedef UINT(CALLBACK * FUN)(LPSTR,HWND,UINT,UINT);

HINSTANCE hDll=LoadLibrary("mpr。DLL”);

FUN myfun

if(hDll!=空)

{

myfun=(FUN)GetProcAddress(hDll," PwdChangePasswordA ");

如果(!myfun)免費圖書館(hDll);

其他

myfun("SCRSAVE ",CPWindow,0,0);//函數的調用

}

}

應用程序-Run();

}

catch(異常異常)

{

Application-ShowException(異常);

}

返回0;

}

// - /

/*{*******************************}*/

/*{*****

單位主頁. h

****}*/

/*{*******************************}*/

// - /

#ifndef UnitmainH

#定義單位維護h

// - /

#包括

#包括

#包括

#包括

#包括

#包括

#包括

// - /

類TFrmmain:公共TForm

{

_ _已發布:// IDE管理的組件

TTimer * timer 1;

TImage * image 1;

void _ _ fast call form create(to object * Sender);

void _ _ fast call form keydown(to object * Sender,WORD Key,

TShiftState Shift);

void _ _ fast call for mousedown(to object * Sender,TMouseButton Button,

TShiftState Shift,int X,int Y);

void _ _ fastcall FormCloseQuery(to object * Sender,bool can close);

void _ _ fast call form close(to object * Sender,TCloseAction Action);

void _ _ fast call image 1 mousedown(to object * Sender,

TMouseButton Button,TShiftState Shift,int X,int Y);

void _ _ fast call image 1 mousemove(to object * Sender,TShiftState Shift,

int X,int Y);

void _ _ fast call timer 1 timer(to object * Sender);

私有://用戶聲明

DWORD PWProtect

DWORD版本;

字符串picdir

int頻率;

公共://用戶聲明

_ _ fast call TFrmmain(t component * Owner);

};

// - /

外部包TFrmmain * Frmmain

// - /

#endif

// - /

/*{*******************************}*/

/*{***** Unitmain.cpp

****}*/

/*{*******************************}*/

// - /

#包括

#pragma hdrstop

#包括

#包含“Unitmain.h”

#包括

// - /

#pragma包(smart_init)

#pragma資源" *。dfm "

TFrmmain * Frmmain

// - /

_ _ fast call TFrmmain::TFrmmain(t component * Owner)

{

}

// - /

void _ _ fast call TFrmmain::form create(to object * Sender)

{

//使窗口成為最上面的窗口。

SetWindowPos(this-Handle,HWND_TOPMOST,0,0,0,0,SWP _ no move | SWP _諾西澤);

//當窗口覆蓋屏幕時。

this-Width =屏幕寬度;

this-Height =屏幕高度;

this-Top = 0;

this-Left = 0;

version = GetVersion();

treg istry * Registry = new treg istry;

嘗試

{

if(版本0x80000000){

registry-root key = HKEY _當前_用戶;

registry-open key(" \控制面板\桌面",false);

pw protect = Registry-ReadInteger(" ScreenSaveUsePassword ");//檢查它是否有密碼保護。

registry-close key();}

registry-root key = HKEY _當前_用戶;

registry-open key(" \ Software \ code hunter ",true);

PicDir = Registry-ReadString(" PicDir ");//獲取圖片目錄

frequency = Registry-ReadInteger(" frequency ");//獲取圖像顯示的頻率

if(picdir = = " ")picdir = " no ";

if(頻率0 | |頻率6)頻率= 2;

定時器1-間隔= 1000 *頻率;設置計時器

}#p#副標題#e#

_ _最後

{

刪除註冊表;

picdir = " no

}

//檢查它是否在NT下運行。

如果(版本!=0)

If(pwprotectversion 0x 8000000)//如果系統要求密碼保護,且系統非NT,則將系統設置為屏保狀態,使光標消失。

SystemParametersInfo(SPI _ SCREENSAVERRUNNING,1,0,0);

而(!show cursor(false)-5);

}

// - /

void _ _ fast call TFrmmain::form keydown(to object * Sender,WORD Key,

TShiftState移位)

{

this-Close();

}

// - /

void _ _ fast call TFrmmain::form mousedown(to object * Sender,

TMouseButton按鈕,TShiftState Shift,int X,int Y)

{

this-Close();

}

// - /

void _ _ fast call TFrmmain::FormCloseQuery(to object * Sender,bool CanClose)

{

if (PWProtect

0x80000000版)

{

bool PassChck

//顯示/顯示光標並調用密碼對話框。

而(!ShowCursor(True)

5);

//With/是VerifyScreenSavePwd函數的動態調用。

typedef UINT(回調* FUN)(HWND);

h instance hDll = LoadLibrary(" password . CPL ");

FUN myfun

if(hDll!=空)

{

myfun=(FUN)GetProcAddress(hDll," VerifyScreenSavePwd ");

如果(!myfun)免費圖書館(hDll);

其他

PassChck = my fun(this-Handle);

}

if(PassChck == false)

{

而(!ShowCursor(False)

-5);

CanClose = false

}

}

}

// - /

void _ _ fast call TFrmmain::form close(to object * Sender,TCloseAction操作)

{

而(!ShowCursor(True)

5);

if(PWProtectVersion0x80000000)

SystemParametersInfo(SPI _ SCREENSAVERRUNNING,0,0,0);//退出屏幕保護狀態

}

// - /

void _ _ fast call TFrmmain::image 1 mousedown(to object * Sender,

TMouseButton按鈕,TShiftState Shift,int X,int Y)

{

this-Close();

}

// - /

void _ _ fast call TFrmmain::image 1 mousemove(to object * Sender,

TShiftState Shift,int X,int Y)

{

static int MouseMoves = 0;

鼠標移動=鼠標移動

  • 上一篇:國家級剪紙文化繼承人
  • 下一篇:天然石頭擺件的風水禁忌有哪些
  • copyright 2024吉日网官网