500分!帮我看看这个实现禁止屏幕保护的程序为何不起作用。(300分)

  • 主题发起人 主题发起人 weiliu
  • 开始时间 开始时间
加MOUSE和模拟按键我也用过的,根本不起作用,可能只能在WIN98里起作用。
 
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, nil,0);
 
然!!!
一起找解决方法
 
菜鸟黄,
有这么简单的话就好了,那个只能用于WIN98的。
 
while true do
begin
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,0,nil,0);
Sleep(1);
end;

给分吧,呵呵
 
iamy,
你这个程序运行起来像是死机一样。
 
函数思想领会错误了,呵呵
应该是这样的
//调用这个禁用屏保
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,0,nil,0);
//调用这个启用屏保
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,1,nil,0);


掉用一次就可以了
不是循环
 
这个和你上一个帖子里面的开头说到的函数调用方法是一样的。。。
好象又绕回去了。。。
不过这个用法确实是可以的
在Delphi带的帮助Windows SDK部分是这样说的

这个参数
SPI_SCREENSAVERRUNNING Windows 95 only: Used internally; applications should not use this flag.



SPI_SETSCREENSAVEACTIVE Sets the state of the screen saver. The uiParam parameter specifies TRUE to activate screen saving, or FALSE to deactivate it.

使用
SPI_SETSCREENSAVEACTIVE作为参数的时候并没有指明Windows 95 only
我试了一下
在XP下是可以的
 
另附关闭打开监视器的代码

type
TMSetMoniterPowerType = (MSMPT_Sleep,MSMPT_AWake);
const
MMPT_Sleep = 1;
MMPT_Awake = -1;

function MSetMoniterPower(AMoniterPowerType:TMSetMoniterPowerType):LRESULT;
const
MoniterPowerType: Array [TMSetMoniterPowerType] of Integer = (MMPT_Sleep,MMPT_Awake);
begin
Result:=SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, MoniterPowerType[AMoniterPowerType]);
end;
 
这个分也一并给我算了,呵呵
打开屏保:
SystemParametersInfo( SPI_SETSCREENSAVEACTIVE,
Cardinal(True),
0,
SPIF_SENDWININICHANGE
);
关闭屏保:
SystemParametersInfo( SPI_SETSCREENSAVEACTIVE,
Cardinal(FALSE),
0,
SPIF_SENDWININICHANGE
);
 
znj_326,
不好意思,刚刚试过了,还是不行的。事实上前面我们也这么试过了。
 
分是我的,已测试通过:
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure ProssesSysMessage(var Msg: Tmsg; var Handle: Boolean);

end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := ProssesSysMessage;
end;

procedure TForm1.ProssesSysMessage(var Msg: Tmsg; var Handle: Boolean);
begin
if (msg.message = WM_SYSCOMMAND) AND (msg.wParam = SC_SCREENSAVE) then
handle := true
else
handle := false;
end;
 
如上就是等运行时阻止
 
kaida,
谢谢你的回答,不过你应该没有仔细看我的问题吧,事实上我第一个贴子就是你这么做的,在不加屏保密码的时候当然可以,但是加了屏保密码是同样不行的,我们都已经试过了。
 
再给你一个函数,运行一次就可以关闭屏保(有密码也同样关闭),直至系统重启。
procedure KillScreenSaver;
var
H: THandle; ScreenSaver: Bool;
begin
if SystemParametersInfo(SPI_GETSCREENSAVEACTIVE,0,@ScreenSaver,0) then
if ScreenSaver then
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,0,NIL,0);
H:=FindWindowEx(0,0,PChar('WindowsScreenSaverClass'),Nil);
if H<>0 then
if SendMessage(H, WM_QUERYENDSESSION,0,0)<>0 then
begin
PostMessage(H, WM_CLOSE,0,0);
Sleep(400);
PostMessage(H, WM_QUIT,0,0);
end;
end;
 
kaida,
你是从大富翁离线资料上找的吧,我早就试过,无效。
而且我的要求是禁止屏保运行起来,并不是运行后才杀掉。
 
请问你的操作系统是什么,如我所写,w2k是没有问题的
 
我在 xp 下测试是正确的,不知你为什么不行?
 
Microsoft Windows 2000 [Version 5.00.2195]
SP4
 
我在 xp,2003, 2000 Pack3 下都能正常禁止屏保。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部