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

  • 主题发起人 主题发起人 weiliu
  • 开始时间 开始时间
W

weiliu

Unregistered / Unconfirmed
GUEST, unregistred user!
运行的时候发现当屏幕保护起作用时,能听到那嘟一声而且提示已有显示,而屏幕保护却依然如故地在运行,并没有被禁止,是怎么回事?不是说那个HANDLE变成TRUE就会禁止屏保运行吗?解决问题的人,本人除了此问题的分数外,另奉送http://www.delphibbs.com/delphibbs/dispq.asp?lid=3630298
中的200分。
程序如下:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure AppMessage(var msg:TMsg;var Handled:boolean);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.AppMessage(var msg:TMsg;var Handled:boolean);
begin
if(msg.message=wm_SysCommand) and (msg.wParam=sc_ScreenSave) then
begin
Handled:=True;
MessageBeep(0);
MessageDlg('Screen-saver is Disabled!',mtWarning,[mbOk],0);
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
// set your applications message handler to your new one
Application.OnMessage := AppMessage;
end;

end.
 
自己处理wm_SysCommand这个消息
 
//禁止
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, nil,0);
//允许
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0,nil, 0);
 
留下Email 给你代码
 
angellover,这个在WIN2K里是没有用的。
iamy,我的邮箱是weiliu86@sohu.com或weiliu86@sina.com
 
SPI_SCREENSAVERRUNNING Windows 95 only: Used internally; applications should not use this flag.
 
发送到:weiliu86@sina.com
请查收
我在XP下面是可以
我这边没有2000,你测试一下看看
 
我晕~只要用一个函数就能实现啦~简单得不能再简单的了
 
//禁止
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, nil,0);
//允许
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0,nil, 0);
 
你这个Handled有些莫名其妙。看看宽达的书吧,里面有个Demo
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure AppMessage(var Msg: TMSG; var HAndled: Boolean);
public
{ Public declarations }
Procedure WndProc(Var Message: Tmessage); override;

end;

var
Form1: TForm1;

implementation

{$R *.dfm}
//在Windows XP SP1 测试通过
procedure TForm1.AppMessage(var Msg: TMSG; var HAndled: Boolean);
begin
// let your application handle all messages initially
Handled := FALSE;
case Msg.Message of
WM_SYSCOMMAND :
if Msg.wParam = SC_SCREENSAVE then
Handled := TRUE; // disable startup of screensavers
end;
end;
procedure TForm1.WndProc(var Message: Tmessage);
begin
With Message do
begin
Case Msg Of Wm_Syscommand:
begin
case wparam of SC_SCREENSAVE:
showMessage('截获屏保消息,关闭屏幕保护!');
end;
end;
end;
end;
inherited;
end;
procedure TForm1.FormCreate(Sender: TObject);
Begin
Application.OnMessage := AppMessage; //在Windows XP SP1 测试通过
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_SCREENSAVE,0); //启动屏幕保护 Windows 2003 好用
Close;
end;
end.
把ShowMessage处用SendMessage关闭屏幕保护即可,但是我没找到怎么关闭,但是屏保消息能截获到.找到关闭的以后发上来让我也看看,希望对你有帮助
 
怎么不把代码发出来啊
 
iamy,
很抱歉,你的程序跟我的那个没有什么不同,本质上是一样的,在WIN2K下还是不能阻挡屏保的到来,只能起提示作用。
 
屏幕保护程序运行起来了吗?
我在XP下的时候
当程序运行的时候
会将所有的sc_ScreenSave命令的消息都截下来
只是会不段的接到这个消息
但是屏幕保护程序并没有运行
 
iamy,
是的,屏保自动运行起来了,但那里的确是有收到提示,我也不知是怎么回事。
也许我的那个程序拿到你的XP系统里也一样可以不让屏保运行起来吧,麻烦你给试试。
 
确实
估计是2000没有等消息返回就执行了屏保
 
在提示的前面加上这个试试呢
Mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);

procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
if (Msg.CmdType and $FFF0) = sc_ScreenSave then
begin
Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0); /////////加在这里
Self.Memo1.Lines.Add('Get Message - ' + IntToStr(TMessage(Msg).WParam) + ' - '
+ IntToStr(TMessage(Msg).WParam)
+ ' - '
+ IntToStr(TMessage(Msg).Result));
Msg.Result := -1;
end else
Inherited;
end;
 
终于查明问题所在:
原来我的,iamy的,Defo_XYF的,三个人的程序都是完全一样的程序,都可以在WIN2000和WINXP里禁止屏保运行,但是,由于我的WIN2000机器上的屏保设置了屏保密码,所以程序就起不了作用了,不信各位可以自己试!
问题的关键在这里,我编这个程序要适应所有公司里的所有机器,基本上台台都加了屏保密码的,各位看看还有何高招解决这个问题!
 

Similar threads

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