大家都知道windows屏幕保護程序的作用,而且新的屏幕保護程序越來越漂亮。如果在win98的桌面右鍵菜單選屬性,就彈出顯示器設置界面,有一個標簽是設置屏幕保護程序的。
在該頁的畫面上,有一個顯示器圖案,如果你選擇win98所帶的屏幕保護程序,這個屏幕保護程序就會在這個小'顯示器'上自動運行,你可以直接看到運行效果.這功能大大方便了屏幕保護程序的選擇,這就是win98對屏幕保護程序的新增接口:預覽功能。
目前大多數新推出的屏幕保護程序都支持這個接口。
屏幕保護程序從它的誕生那時起,在同一時刻只能運行一個,不能多個同時運行,然而預覽接口的推出,使同時預覽多個屏幕保護程序成為可能,本文將向讀者介紹如何用Delphi開發這樣一個程序。
1.屏幕保護預覽接口
屏幕保護預覽接口的使用很簡單,這是通過傳給屏幕保護程序的命令行參數來實現的,該命令行參數格式為:
screensaver.exe/p#####
其中#####為一個有效的窗口句柄的10進制表示。
這個窗口我們可以稱之為預覽窗口。
實際上,支持預覽接口的屏幕保護程序將自己的窗口創建為預覽窗口的子窗口來實現預覽功能的。
2.畫面布局
我們這個程序的窗口分為3部分,為倒'品'字形,上左部分列出所有可用的屏幕保護程序,上右部分列出所有預覽的屏幕保護程序,下面當然是預覽窗口了。
用Delphi實現時,首先在Form裡放2個TPanel組件,Panel1對齊方式為頂部對齊,Panel2為撐滿用戶區,再在Panel1中放1個TFileListBox組件和一個TListBox組件,FileListBox1左對齊,ListBox1撐滿用戶區.
這樣,FileListBox1為屏幕保護列表,ListBox1為預覽列表,Panel2為預覽窗口。
3.列出屏幕保護程序.
將FileListBox1的Mask屬性設為'*.scr',這是屏幕保護程序的擴展名。
在FormCreate方法中將FileListBox1.directory設為windows系統目錄GetSystemDirectory;
4.預覽屏幕保護程序.
在FileListBox1DblClick方法中運行該屏幕保護程序,並將Panel2的窗口句柄傳給它.
WinExec(pchar(FileListBox1.FileName+'/p'+inttostr(Panel2.handle)),SW_Show);
運行程序,怎麼樣?COOL!
5.增加一些新特性:隱藏/顯示/關閉。
增加2個函數:用於更新ListBox1。
functionEnumProc(
h:HWND;//handleofchildwindow
l:integer//application-definedvalue
):boolean;stdcall;
varbuf:array[0..255]ofchar;
begin
GetWindowText(h,buf,sizeof(buf)-1);
ifiswindowvisible(h)then
Form1.ListBox1.items.add
(''+strpas(buf)+':'+inttostr(h))
else
Form1.ListBox1.items.add
('-'+strpas(buf)+':'+inttostr(h));
Result:=true;
end;
procedureTForm1.Fresh1;
begin
ListBox1.clear;
enumChildwindows(Panel2.handle,
TFNWndEnumProc(@enumproc),0);
end;
增加一個彈出菜單Popupmenu1,3個菜單項,'Show,Hide,Close',將ListBox1.popupmemu指向Popupmenu1。
Hide的處理函數是:
procedureTForm1.Hide1Click(Sender:TObject);
varh:integer;
s:string;
begin
ifListBox1.itemindex=-1thenexit;
s:=Listbox1.items[ListBox1.itemindex];
h:=strtoint(copy(s,pos(':',s)+1,length(s)));
ShowWindow(h,SW_HIDE);
Fresh1;
end;
Show的處理函數是:
procedureTForm1.Show1Click(Sender:TObject);
varh:integer;
s:string;
begin
ifListBox1.itemindex=-1thenexit;
s:=Listbox1.items[ListBox1.itemindex];
h:=strtoint(copy(s,pos(':',s)+1,length(s)));
ShowWindow(h,SW_SHOW);
Fresh1;
end;
Close的處理函數是:
procedureTForm1.Close1Click(Sender:TObject);
varh:integer;
s:string;
begin
ifListBox1.itemindex=-1thenexit;
s:=Listbox1.items[ListBox1.itemindex];
h:=strtoint(copy(s,pos(':',s)+1,length(s)));
PostMessage(h,WM_QUIT,0,0);
Fresh1;
end;
本程序在Delphi6.0下調試通過,應該能用Delphi6.0/7.0編譯。
完整程序如下:
unitUnit1;
interface
uses
Windows,Messages,SysUtils,Classes,
Graphics,Controls,Forms,Dialogs,
StdCtrls,FileCtrl,ExtCtrls,Menus;
type
TForm1=class(TForm)
Panel1:TPanel;
Panel2:TPanel;
FileListBox1:TFileListBox;
ListBox1:TListBox;
PopupMenu1:TPopupMenu;
Hide1:TMenuItem;
Show1:TMenuItem;
Close1:TMenuItem;
procedureFormCreate(Sender:TObject);
procedureFileListBox1DblClick(Sender:TObject);
procedureHide1Click(Sender:TObject);
procedureShow1Click(Sender:TObject);
procedureClose1Click(Sender:TObject);
private
{Privatedeclarations}
public
{Publicdeclarations}
procedureFresh1;
end;
var
Form1:TForm1;
implementation
{$R*.DFM}
functionEnumProc(
h:HWND;//handleofchildwindow
l:integer//application-definedvalue
):boolean;stdcall;
varbuf:array[0..255]ofchar;
begin
GetWindowText(h,buf,sizeof(buf)-1);
ifiswindowvisible(h)then
Form1.ListBox1.items.add
(''+strpas(buf)+':'+inttostr(h))
else
Form1.ListBox1.items.add
('-'+strpas(buf)+':'+inttostr(h));
Result:=true;
end;
procedureTForm1.Fresh1;
begin
ListBox1.clear;
enumChildwindows(Panel2.handle,
TFNWndEnumProc(@enumproc),0);
end;
procedureTForm1.FormCreate(Sender:TObject);
varbuf:array[0..256]ofchar;
begin
GetSystemDirectory(buf,sizeof(buf)-1);
FileListBox1.directory:=strpas(buf);
ListBox1.popupmenu:=Popupmenu1;
end;
procedureTForm1.FileList
Box1DblClick(Sender:TObject);
begin
WinExec(pchar(FileListBox1.FileName
+'/p'+inttostr(Panel2.handle)),
SW_Show);
Fresh1;
end;
procedureTForm1.Hide1Click(Sender:TObject);
varh:integer;
s:string;
begin
ifListBox1.itemindex=-1thenexit;
s:=Listbox1.items[ListBox1.itemindex];
h:=strtoint(copy(s,pos(':',s)+1,length(s)));
ShowWindow(h,SW_HIDE);
Fresh1;
end;
procedureTForm1.Show1Click(Sender:TObject);
varh:integer;
s:string;
begin
ifListBox1.itemindex=-1thenexit;
s:=Listbox1.items[ListBox1.itemindex];
h:=strtoint(copy(s,pos(':',s)+1,length(s)));
ShowWindow(h,SW_SHOW);
Fresh1;
end;
procedureTForm1.Close1Click(Sender:TObject);
varh:integer;
s:string;
begin
ifListBox1.itemindex=-1thenexit;
s:=Listbox1.items[ListBox1.itemindex];
h:=strtoint(copy(s,pos(':',s)+1,length(s)));
PostMessage(h,WM_QUIT,0,0);
Fresh1;
end;
end.