用delphi做好一个屏保,我想知道在程序里怎样控制这个屏保的运行。
  在桌面属性中选中屏保,设为等待一分钟,屏保运行正常。
  比如:进入一个程序后,一开始关闭屏保,然后当满足某一条件,比如当计时器开启200秒后,激活屏保。
  看了网上很多都说用
    SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,1, nil, 0); //打开
  和 SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,0,nil,0);  //关闭
  但我试了试,没反应呀。  当我用SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,0,nil,0); 时,屏保是被关闭了,但我再用第一条语句,却没有激活。

解决方案 »

  1.   

    上面的是欺骗windows的,让它以为起来了SendMessage(HWND_BROADCAST,WM_SYSCOMMAND,SC_SCREENSAVE,0);
      

  2.   

    uses inifiles;var
      DelphiIni: TIniFile;
      s:String;
    begin
    //解除屏保  
      DelphiIni := TIniFile.Create('system.ini');
      s:=delphiini.ReadString('boot','SCRNSAVE.EXE', '');
      DelphiIni.WriteString('boot', 'SCRNSAVE.EXE', '');
      DelphiIni.Free;   showMessage(s);
    //do someting.........//重设屏保
      DelphiIni := TIniFile.Create('system.ini');
      DelphiIni.WriteString('boot', 'SCRNSAVE.EXE', s);
      DelphiIni.Free;end;
    可以在中间多加一些判断,不过大致如此.
      

  3.   

    http://www.delphibyte.com/article/viewart.php?id=108当一个程序需要阻止屏幕保护程序一段时间时,有以下两种方法:
      
      第一种方法是使用API函数SystemParametersInfo来禁止屏幕保护程序,最来再激活它。
      
      使用这种方法,你只最简单地在Form.OnCreate中加入禁止代码,在Form.OnDestroy加入激活代码:
      
      --------------------------------------------------------------------------------
      
      TMyForm = class(TForm) 
      
          ... 
           
          procedure FormCreate(Sender: TObject); 
          procedure FormDestroy(Sender: TObject); 
      
          ... 
           
      end; 
      
      procedure TMyForm.FormCreate(Sender: TObject); 
      begin 
           ... 
           
           //Disable screensaver 
           SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, nil, 0); 
           
           ... 
           
      end; 
      
      procedure TMyForm.FormDestroy(Sender: TObject); 
      begin 
           ... 
           
           //Disable screensaver 
           SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, nil, 0); 
           
           ... 
           
      end; 
      
      --------------------------------------------------------------------------------
      
      这种方法会导致一个问题:如果程序是由其它原因关闭,并没有触发OnDestroy事件,在这种情况下,屏幕保护程序就再也不会被激活了!
      
      
      解决这个问题的方法是在程序的主窗口中拦截WM_SYSCOMMAND消息:当要妄动屏幕保护程序时,Windows向所有的最高层窗口发送这个消息,包含的wParam参数设置为SC_SCREENSAVE。你只要设置这个消息的返回值为一个非零值,则屏幕保护程序将不会启动。
      
      如果你的程序由于未知原因关闭了,那么你的程序将不会响应这个消息,于是屏幕保护程序正常启动。
      
      Here how to use this tecnique. 
      以下就是这个技巧:
      
      --------------------------------------------------------------------------------
      
      在你的窗体中声明一个消息句柄如下:
      
      TMyForm = class(TForm) 
      
          ... 
      
          private 
            procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND; 
      
          ... 
      
      end; 
      
      在实现部分这样做: 
      
      procedure TMyForm.WMSysCommand(var Message: TWMSysCommand); 
      begin 
           if Chr(Message.Msg) = SC_SCREENSAVE then 
              Message.Result := 1 
           else 
             Inherited; 
      end; 
       
      

  4.   

    >>屏保是被关闭了,但我再用第一条语句,却没有激活。
    設置後, 再用
    sendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);