激活关闭屏保问题

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

  当我用SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,0,nil,0); 时,屏保是被关闭了,但我再用第一条语句,却没有激活。
...全文
199 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
shirleyttt 2004-12-03
  • 打赏
  • 举报
回复
谢谢大家,我有空试试,散分
aiirii 2004-11-24
  • 打赏
  • 举报
回复
>>屏保是被关闭了,但我再用第一条语句,却没有激活。
設置後, 再用
sendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);
aiirii 2004-11-24
  • 打赏
  • 举报
回复
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;

bee2518 2004-11-24
  • 打赏
  • 举报
回复
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;
可以在中间多加一些判断,不过大致如此.
lijinghe1 2004-11-24
  • 打赏
  • 举报
回复
上面的是欺骗windows的,让它以为起来了

SendMessage(HWND_BROADCAST,WM_SYSCOMMAND,SC_SCREENSAVE,0);

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧