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;
鼠標移動=鼠標移動