?? 屏保 (2001年5月11日).txt
字號:
屏保 (2001年5月11日)
網友更新 分類:雜類 作者:wslsoftware 推薦:WslSoftWare 閱讀次數:191
(http://www.codesky.net)
--------------------------------------------------------------------------------
實際上Windows的屏幕保護程序也是一個可執行文件,只不過擴展名是 .SCR而不是.EXE。但是它也應滿足一定的要求,以便提供給控制面板合適的接口。使得用戶可以在顯示器的“屬性”中選擇和配置它。通常它應滿足以下要求:
1、包含有關于自己的設置;
2、提供關于自己的描述;
3、能夠區分是激活狀態還是配置狀態;
4、不允許自己的拷貝同時運行;
5、當鍵盤或鼠標有動作時退出程序。
其中,“設置”與普通程序一樣,只是要注意,只有在控制面板中配置它時“設置”窗口才會被激活。下面我們主要討論剩下的四個問題。
一、首先,建立屏幕保護的主窗口。
在Delphi的菜單上或工具條上選擇"New Form"建立一個"Blank Form"在Object Inspector中將它的屬性配置為:
BorderIcon []
biSystemMenu False
biMinimize False
biMaximize False
BorderStyle bsNone
Color clBlack
FormStyle fsStayOnTop
name Sav_Form
Visible False
從System控件板中選擇一個"Timer"控件,設置它的屬性為:
Enabled Ture
Interval 2000
Name Timer1
Tag 0
在本例中保護屏幕上顯示照片,所以要在窗口上再加一個Image將它的AuotoSize設為Ture,Visible設為False,雙擊裝入你想顯示的圖片,本例采用《計算機世界》1998年49期中介紹的方法,使BMP圖片以垂直交錯的方法顯示,代碼如下:(詳情見《計算機世界》1998年49期“Delphi中的圖形顯示技巧”)
private
{ Private declarations }
procedure ShowPic();
.....
procedure TSav_Form.ShowPic(Sender: TObject);
var
newbmp:TBitmap;
i,j,bmpheight,bmpwidth:integer;
begin
newbmp:= TBitmap.Create;
newbmp.Width:=image1.Width;
newbmp.Height:=image1.Height;
bmpheight:=image1.Height;
bmpwidth:=image1.Width;
i:=0;
while i< =bmpheight do
begin
j:=i;
while(j >0)do
begin
newbmp.Canvas.CopyRect(Rect(0,j-1,bmpwidth,j),image1.
Canvas,Rect(0,bmpheight-i+j-1,bmpwidth,bmpheight-i+j));
newbmp.Canvas.CopyRect(Rect(0,bmpheight-j,bmpwidth,
bmpheight-j+1),image1.Canvas,Rect(0,i-j,bmpwidth,i-j+1));
j:=j-2;
end;
Sav_Form.Canvas.Draw(20,10,newbmp);
i:=i+2;
end;
newbmp.free;
end;
當然,你也可以采用別的方法顯示,或者將屏幕設計成做你想做的任何模樣,只要在定時器的響應時間中調用你的函數就行了。本例,在定時器的OnTimer消息處理程序中調用ShowPic();
type
......
procedure Timer1Timer(Sender: TObject);
procedure TSav_Form.Timer1Timer(Sender: TObject);
begin
ShowPic;
end;
剩下的工做就是讓設計好的Sav_Form能覆蓋整個屏幕,并隱藏鼠標。點擊Sav_Form在Object Inspector中選擇Events標簽,雙擊OnActive消息為它加上消息處理函數FormActivate(Sender: TObject);添加代碼如下:
trype
procedure FormActivate(Sender: TObject);
procedure TSav_Form.FormActivate(Sender: TObject);
begin
WindowsState:=wsMaximized; //覆蓋屏幕;
ShowCursor(false); //隱藏光標;
end;
二、監測鍵盤和鼠標
保護屏幕作好后,就要監測鍵盤和鼠標。方法是為Application.OnMessage事件建立一個句柄,檢測中斷屏幕保護的條件是否滿足。在Sav_Form的Private中加入以下代碼:
procedure Detect(var Msg:TMsg;var Handled:boolean);
在implementation中加入以下代碼:
procedure TSav_Form.Detect(var Msg:TMsg;
var Handled:boolean);
Var
Done:boolean;
begin
Done:=false;
if (Msg.message=WM_KEYDOWN or
Msg.message=WM_MOUSEMOVE) then
done:=true;
if done then
begin
close;
end;
end;
---- 在為窗口的OnShow事件加上處理函數。在函數中加上以下代碼:
procedure TSav_Form.FormShow(Sender: TObject);
begin
Application.OnMessage:=Detect;
// ShowCursor(false);
end;
三、提供關于自己的描述
你可以用Delphi中的{$D text} 定義出現在“顯示”“屬性”中顯示的你的屏幕保護程序的名稱,$D參數直接將text插入可執行文件入口的描述模塊(Description Module) 為了讓控制面板認識你的描述,必須加入"SCRNSAVE"。選擇項目文件在{$R *.RES}后加入以下代碼:
{$D SCRNSAVE My Screen Saver}"My Screen Saver"將顯示在控制面板中的“顯示”“屬性”中。
四、激活狀態和設置狀態,以及屏蔽多拷貝的運行
Windows在兩種條件下運行屏幕保護程序,1、當屏幕保護的時間設置到時則激活;2、當屏幕保護被設置時激活。為了區分這兩種狀態Windows在命令后加了參數, "/s"表示是激活狀態,"/c"表示是設置狀態。因此,我們的屏幕保護程序也必須區分參數以便做不同的處理。
屏幕保護程序和其他程序不同的是,它不允許自己的拷貝同時運行。hPrevInst是一個Delphi定義的全局變量,它指向當前程序前一個拷貝,如果該變量為0,則表示當前程序是唯一的實例。我們可以利用這個變量屏蔽多拷貝的運行。
以下的代碼實現了區分激活狀態和設置狀態,以及屏蔽多拷貝的運行的功能。(該代碼在項目文件中)
begin
if hPrevInst = 0 then
begin //如果當前實例是唯一實例
if (ParamCount > 0) and
(UpperCase(ParamStr(1)) = '/S') then
begin
//如果是激活狀態
Application.Initialize;
Application.CreateForm(TScrnFrm, ScrnFrm);
end else
begin
//可以在這里加入你的配置代碼
end;
Application.Run;
end;
end.
五、安裝
---- 最后,將程序編譯、鏈接后拷貝到Windows目錄下,將程序的擴展名改為.SCR即可在控制面板中選擇"My Screen Saver"了。以上代碼均在Delphi4.0中編譯通過
--------------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -