Windows Shell编程
那本书讲的很清楚,才30元。
如果要程序,我有一个VC编的。非常完善的程序。

解决方案 »

  1.   

    很简单,屏保其实也是程序,只不过需要把扩展名改为scr
    屏保程序应该接受几个参数:
    /p   表示预览,其后跟一个数字,是预览窗口的Handle(或者是预览窗口的DC,记不清了)
    /s   启动屏保
    好像还有一个/c,记不清了,自己试试吧。
      

  2.   

    屏幕保护其实也是可执行程序注意响应他的鼠标和键盘时间就可以了还有,扩展名为.scr
      

  3.   

    把做好的程序改名为*.scr,放在system目录下就行了
      

  4.   

    to netcrawller(寒夜孤星):
      没看到我的回复吗,如果要求不高,这样是可以的。
      只不过需要自己处理屏保运行时的鼠标和键盘操作。
      

  5.   

    最简单的就是写个单实例的.exe,然后把他该成.scr
      

  6.   

    我收藏的~~(转贴)~~你试试吧~~
    用DELPHI设计屏幕保护程序屏幕保护程序是一类特殊的WINDOWS程序。如果已安装了屏幕保护程序,超过等待时间没有鼠标和键盘操作,WINDOWS会自动运行屏幕保护程序以保护屏幕。在休息之余,欣赏一下漂亮的WINDOWS屏幕保护,使人赏心悦目。那么设计屏幕保护程序要注意哪些方面?由于屏幕保护程序需满足一些特殊条件,比如屏幕保护程序只能有一个实例运行,运行后一旦使用鼠标或键盘应立即结束程序,能接受参数等。设计屏幕保护程序要充分考虑到这些,本文探讨用DELPHI制作一个屏幕保护程序(以下简称SCR),最后给出一个可运行的实例。----一、TCanvas与TBitMap对象、JPEG对象:----DELPHI的TCanvas封装了大部分WINDOWS对图形的操作,SCR运行时各种图像千变万化、图形变幻无不是TCanvas的“杰作”。TBitMap对象有一个LoadFromFile()方法,能从BMP图像文件取得位图。一般情况下,设计SCR要创建至少一个TBitMap对象,由于窗体和TBitMap对象都有Canvas属性,可利用TCanvas中的各种函数设计图像。设计一个有各种图像变化效果的SCR常用到以下函数:----1、CopyRect方法:从其原型CopyRect(Dest:TRect;Canvas:TCanvas;Source:TRect)可看出,它将源画布某一矩形区域的图像复制到另一个画布的矩形区域。由于是内存的成块复制,因此具有很高的执行效率。在Timer组件的OnTimer事件程序中灵活使用该函数,可以设计出各种美观演示效果:如百叶窗、推拉、马赛克、随机线、反像等等。将以下代码加入到OnTimer事件程序,可演示各种图像效果,这里仅举出两种效果,读者可参考有关资料设计更多更漂亮的演示效果。
    ......
    case PlayMode of
    0:begin //从左向右移动(设x初值为Screen.Width) 
    x:=x-10;
    SCRSaverFrom.CopyRect(Rect
    (x,0,x+10,Screen.Height),Bit.Canvas, 
    Rect(x,0,x+10,Screen.Height));
    if x=0 then ChangePictureAndPlayMode;//改变图像及演示模式
    end;
    1:begin //马赛克
    for i:=0 to Screen.Width*Screen.Height div 10 do
    begin
    j := Random(Screen.Width div 4)*4; 
    k := Random(Screen.Height div 4)*4;
    SCRSaverFrom.CopyRect(Rect(j,k,j+4,k+4),Bit.Canvas,
    Rect(j,k,j+4,k+4));
    end;
    SCRSaverFrom.CopyRect(Rect
    (0,0,Screen.Width,Screen.Height),Bit.Canvas,
    Rect(0,0,Screen.Width,Screen.Height));
    ChangePictureAndPlayMode; //改变图像及演示模式
    end;
    2: ......
    ......
    end;
    ----2、StretchDraw方法:一般说来,使用CopyRect方法要求源矩形与目的矩形
    应相等,如果两者尺寸相差太大时,色彩可能失真。使用StretchDraw能避免这个
    问题,其原型为:StretchDraw(constRect:TRect;Graphic:TGraphic)。它可在画
    布指定的矩形区域内完整地“画”出一个图像,如果源图象区域与目的区域尺寸
    不一致,会自动Stretch(拉伸),能有效的避免色彩失真。但此函数只能“画”
    出整个图像,如果只需“画”出一部分图像则应配合CopyRect()使用,先用
    StretchDraw()使整幅位图变形”输出到一个画布,然后再用CopyRect()函数将所
    需部分“画出”。----3、TextOut方法:在指定的位置输出一串文字。在Canvas中还有很多函数可
    绘制图形,也能用于SCR的设计,这里就不加介绍。----4、支持JPEG图像。由于JPEG图像格式具有很好的压缩性能,是最常用的图像
    格式之一。DELPHI3/4中新加入了对JPEG图像的支持,JpegImage是TGraphic的派
    生类,它的LoadFromFile方法可从JPEG文件取出一幅图像,JpegImage没有Canvas
    属性,不能用CopyRect()方法,但其它画布可用StretchDraw()方法显示出一个
    JPEG图像,就将JPEG图像转换成位图。请看下面例子,其中Bit为全局的TBitMap
    对象。注意:使用JpegImage应在USES中加入JPEG单元。procedure LoadBMPFromJPEG(JPEGFileName:String);
    // 从JPEG 文 件 中 取 图 像
    var JpegImage1:TJpegImage;
    begin
    JpegImage1 := TJpegImage.Create;
    JpegImage1.LoadFromFile(JPEGFileName);
    Bit.Width := JpegImage1.Width ; 
    // 使 位 图 与JPEG 图 像 尺 寸 相 等
    Bit.Height := JpegImage1.Height ;
    Bit.Canvas.StretchDraw(Rect
    (0,0,Bit.Width,Bit.Height),JpegImage1);
    JpegImage1.Free ;
    end;----二、MediaPlayer和Timer组件:----MediaPlayer组件封装了MCI中绝大部分的功能,利用它很容易播放WAVE和
    MIDI音乐,为SCR添加美妙的背景音乐。有关代码如下:ifMediaPlayer1.Mode<>mpPLayingthen
    //音乐播放完后,更换音乐
    begin
    inc(i);
    MediaPlayer1.FileName:=IntToStr(i)+`.WAV`;
    //逐一播放1.wav,2.wav...
    MediaPlayer1.Open;
    MediaPlayer1.Play;
    end;----Timer组件是一个定时器,它的Interval属性指定定时器的间隔时间,每隔
    指定的时间就会执行一次OnTimer事件,SCR的OnTimer事件内要完成演示图像,
    更换图像,检查音乐是否播放完毕,更换音乐等各项工作。因此,Timer是设计
    SCR程序必不可少的组件。----三、设置SCR的窗体:----SCR的窗体与一般程序的窗体没有太大的区别。设计时只需注意到以下几点:----1、设置窗体属性:WindwoState属性一般设为wsMaximized,使窗体覆盖整
    个屏幕;BorderStyle属性设为bsNone,使窗体无边框、标题;FormStyle属性设
    为fsStayOnTop,使窗体总是保持在屏幕最上面。----2、防止SCR重复运行:为防止程序重复运行,在WINS95/98可用API函数
    FindWindow查找已运行的窗体类型,API函数原型:
    HWNDFindWindow(LPCTSTRlpClassName,LPCTSTRlpWindowName)。以下演示SCR是
    如何避免重复运行的。打开Project,在USES单元中加入WinTypes和SysUtils单元。
    program Project1;
    uses
    Forms, WinTypes, SysUtils, //后两者为新加入单元
    Unit1 in `Unit1.pas` {MyScreenSaverForm};
    {$R *.RES}
    var FindWindwsHandle:array[0..255] of Char; //存放窗体名
    para1:String;
    ......
    StrPCopy(FindWindwsHandle,`TMyScreenSaverForm`);
    //TMyScreenSaverForm是这个SCR的窗体名。
    if FindWindow(FindWindwsHandle,Nil) = 0 //寻找同一窗口类型
    then ...... //没有同一窗体重复运行
    else ...... //发现有同一窗体重复运行
    ......----注意:由于Dephi在设计窗体时已向Windows登记了TMyScreenSaverForm窗
    体,若在Dephi调试器内运行该程序,FindWindow函数会发现已有一个窗体,
    它会执行else后面的代码,调试时应注意这一点。如要使该程序顺利运行,须
    先执行File菜单中的Close命令,将TMyScreenSaverForm窗体关闭掉。----3、SCR的鼠标:显示/隐藏鼠标:SCR有时运行中应能隐藏鼠标,可用API函数ShowCursor,该
    函数:intShowCursor(BOOLbShow)。bShow是一个布尔类型变量,取False值隐
    藏鼠标,取True值显示鼠标。
    取鼠标位置:取鼠标所处位置可用GetCurSorPos过程,原型为:
    GetCurSorPos(MousePos:TPoint),MousePos为鼠标所处位置。
    SCR一旦在捕获鼠标移动消息,就将当前鼠标的位置与已保存的位置比较,计算
    出鼠标移动的距离。----四、捕获鼠标与键盘消息:----SCR运行后,按下、移动鼠标或敲击键盘都应立即作出反应,中断程序运行。
    这有两种办法可解决。一是在窗体所有与鼠标、键盘有关的事件内加入Close过
    程,如OnMouseMove、ONKeyDown等事件。这样一旦用户移动鼠标或按下鼠标(键
    盘)都会关闭程序。这种方法简单易行,但有一个缺陷,按鼠标中、右键却不能
    关闭程序。二是使用Application对象的OnMessage事件,我们可为该事件定义一
    个处理程序,以捕获传递的消息,捕获消息后判定消息是否为鼠标或键盘消息,
    如果是,就决定是否关闭程序。假定CloseSCR是用户编写捕获消息程序,要先设
    定Application.OnMessage:=CloseSCR。捕获鼠标、键盘就关闭SCR的程序如下:procedure TMyScreenSaverForm.CloseSCR
    (var Msg:TMsg;var Handled:boolean);
    var x,y:Integer;
    begin
    case Msg.message of
    WM_MOUSEMOVE : begin 
    //以下为鼠标消息,MousePos为已保存鼠标位置
    x := Abs(loWord(Msg.lParam)-MousePos.x);
    y := Abs(HiWord(Msg.lParam)-MousePos.y);
    if (x >10) or (y >10) then Close;
    end;
    WM_LBUTTONDOWN : Close;
    WM_MBUTTONDOWN : Close; //按下鼠标中键
    WM_RBUTTONDOWN : Close; //按下鼠标右键
    WM_KEYDOWN : Close; //以下为键盘消息
    WM_KEYUP : Close;
    WM_SYSKEYDOWN : Close;
    WM_SYSKEYUP : Close;
    end;
    end;----五、运行SCR时的参数:----最后一个问题是:WINDOWS是如何运行SCR程序的?SCR有三种运行方式:
    1、屏保2、设置3、预览。屏保方式是SCR最主要的运行方式,处于屏保方式时,
    SCR实现屏幕保护的功能,显示出各种图像;处在设置方式时,SCR可让用户设置
    有关信息,如更换图片、声音等;在?显示器属性”的“屏幕保护程序”页面中间
    有一个计算机图像。有些SCR程序运行于预览方式时,屏幕保护图像不是在整个屏
    幕上显示,而是显示在这个计算机图像的“显示器”内。----WINDOWS启动运行SCR的秘密在哪里?它就在于参数。WINDOWS可让SCR带三种
    不同的参数运行:/S、/C、/P。其中/S参数通知SCR运行于屏幕保护状态;/C(在
    WIN98则以/C:XXXX参数)和/P参数分别运行于设置与预览方式。打开“显示器属
    性”,选中“屏幕保护程序”页面后,只要已选中一个SCR,Windows95都会不断
    以SCRFileName/PXXXXX启动该屏保程序,XXXXX就是页面上计算机“显示器”窗体
    的句柄(处在/P参数的运行,可由这个窗体句柄取得DC,这里就不再叙述了)。
    如果选中[设置(T)...]或[预览(V)]按钮,Windows会先中断已运行的SCR(如果有
    以/P参数运行的SCR的话),再以/C或/P参数,启动选中的SCR。如果选中了一个
    SCR,按右键,出现快捷菜单,其中有“测试(E)”、“配置(O)”、?安装(I)”等
    项:它们分别以/C参数、无参数、/P参数运行SCR。需注意的是,这里的“配置”
    就是“设置”,奇怪的是,却没有任何参数。----在DELPHI中,ParamCount函数可取得命令行参数个数,ParamStr(Index:Integer)
    则返回命令行中相应参数字符串,其中ParamStr(0)为程序名,ParamStr(1)中的存
    放有WINDOWS启动SCR的第一个参数。了解这些可以帮助我们根据不同的参数设置运
    行时的主窗体。假定某SCR有二个窗体,与预览、设置二种运行方式相对应,其窗体
    名分别为FormA,FormB,则编写Project程序如下:
    if (Paramcount >0) then
    begin
    para1 := Copy(UpperCase(ParamStr(1)),1,2);
    if para1=`/S` then //预览
    begin
    Application.Initialize;
    Application.CreateForm(TFormA, FormA);
    Application.CreateForm(TFormB, FormB);
    Application.Run;
    end;
    if para1=`/C` then //设置
    begin
    Application.Initialize;
    Application.CreateForm(TFormB, FormB);
    Application.CreateForm(TFormA, FormA);
    Application.Run;
    end;
    end else begin //设置
    Application.Initialize;
    Application.CreateForm(TFormB, FormB);
    Application.CreateForm(TFormA, FormA);
    Application.Run;
    end;----六、示例:一个随机播放音乐、演示图像的SCR。----这个SCR能允许用户随意设置播放的音乐(WAVE和MIDI)和演示的图像(BMP
    和JPEG),由于篇幅有限,只设计了几种简单的演示效果。----步骤如下:
    ----1、创建一个工程项目,将窗体取名为:MyScreenSaverForm。
    ----2、加入Timer、TOpenDialog、TMediaPlayer等组件:
    ----3、创建有关事件,加入程序代码。
    ----4、在DELPHI中编译成可执行文件。
    ----5、将可执行文件名改为XXXXX.SCR,复制到WINDOWS目录
    ----6、打开显示器属性,打开屏幕保护程序页面,你会发现XXXXX已加入到屏幕保
    护程序列表框中,即可设为活动的的屏幕保护程序。 
    ;