如何禁止屏保的运行?

Behard 2003-02-20 05:11:11
我重载了 WndProc 函数
void __fastcall TfrmMain::WndProc(Messages::TMessage& Message)
{
if ( (Message.Msg == WM_SYSCOMMAND)&& (Message.WParam == SC_SCREENSAVE) ) //屏保
{
if ( ! GCTGconfig.runscreen ) return;
}
if ( (Message.Msg == WM_SYSCOMMAND)&& (Message.WParam == SC_MONITORPOWER) ) //显示器电源
{
if ( ! GCTGconfig.runscreen ) return;
}

TForm::WndProc(Message);//对于其他的消息,调用基础类的WndProc函数让Windows进行缺省处理。
}

但是如果当前活动窗口不是该应用程序后,无法获得 SC_SCREENSAVE 和 SC_MONITORPOWER 消息

我看 VCD、DVD 等的播放器是可以的
难道是要使用 Hook 吗?
...全文
251 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Behard 2003-02-24
  • 打赏
  • 举报
回复
写错了
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, false, NULL,SPIF_SENDCHANGE)
Behard 2003-02-24
  • 打赏
  • 举报
回复
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, NULL,SPIF_SENDCHANGE)
就可以了
he_Fly 2003-02-21
  • 打赏
  • 举报
回复
NT下面肯定是不行的,可以用结束任务退出来,估计2000也一样.
wuxiaoyong 2003-02-21
  • 打赏
  • 举报
回复
我在2000下试的,
好用!
Behard 2003-02-21
  • 打赏
  • 举报
回复
To wuxiaoyong(吴晓勇) :
可能在 Win98 下可以,不过在 Win2000 下不行
wuxiaoyong 2003-02-21
  • 打赏
  • 举报
回复
禁止
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, NULL,0)

BOOL SystemParametersInfo(

UINT uiAction, // system parameter to query or set
UINT uiParam, // depends on action to be taken
PVOID pvParam, // depends on action to be taken
UINT fWinIni // user profile update flag
);

这样就行了!
penu 2003-02-21
  • 打赏
  • 举报
回复
几个方法:
一、改注册表:
1、ScreenSaveActive=0

2、ScreenSaveTimeOut=0
改完后:
SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);

二、向系统发消息,欺骗系统以为当前已在屏保状态,这样系统就不会进行屏保计时。
具体是什么消息一时想不起来了,你可以查一下有关WIN98下屏蔽Ctrl+Alt+Del的贴子。
这种方法是WIN98下屏蔽Ctrl+Alt+Del的典型做法。
penu 2003-02-21
  • 打赏
  • 举报
回复
不知道《C++Builder深度历险》里有没有你想要的东西?
Behard 2003-02-21
  • 打赏
  • 举报
回复
kingcaiyao(AKing) and ffww :
你们的程序和我的没有什么区别呀?

当前 Active Form 不是该程序或者加了 WndProc 等函数出来的,照样会启动屏保

而且我发现一个非常奇怪的问题:
在 Win2000P SP2 下,使用 Regedit 修改 ScreenSaveActive 的值,并没有马上生效,要重新加载注册表【注销】才行,如果是这样怎么使用 ScreenSaveActive 控制呀?
kingcaiyao 2003-02-20
  • 打赏
  • 举报
回复
Do it:
class TForm1:public TForm
{
private:
public:
protected:
virtual void __fastcall WndProc(TMessage &Message);
};
.cpp File
void __fastcall TForm1::WndProc(TMessage &Message)
{
if(Message.Msg==WM_SYSCOMMAND)
{
if(Message.WParam==SC_SCREENSAVE)
{
Message.WParam=0;
}
}
TForm::WndProc(Message);
}
ffww 2003-02-20
  • 打赏
  • 举报
回复
Windows在启动屏幕保护程序前会向当前激活的应用程序发送WM_SYSCOMMAND消息,其中wParam参数指定了即将执行的系统命令类型,在本例中其值为SC_SCREENSAVE。问题在于程序如何捕获这个消息呢?在C++ Builder中可以利用TApplication类的OnMessage事件句柄来处理这个消息。应用程序在接收到任何Windows消息后都会触发TApplication类的OnMessage事件,通过定义这个事件的处理程序,可以捕获发送给应用程序的所有Windows消息(这当然不包括在程序中用SendMessage函数发送的消息)。

---- OnMessage事件的定义如下:

typedef void__fastcall(__closure
*TMessageEvent)(tagMSG &Msg,bool&Handled);
__property TMessageEvent OnMessage=
{read=FOnMessage,write=FOnMessage};

---- 其中TMessageEvent类型是OnMessage事件的类型,它定义了处理消息的方法,Msg参数给出了Windows消息的相关信息,其结构如下:

typedef struct tagMSG{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;}

---- Handled参数决定了如何对消息进行下一步处理,如果在接收到一个消息后将Handled参数设为true,则这个消息将不会得到进一步的处理,在本例中就是取消屏幕保护程序的激活。

---- 启动C++ Builder,新建一工程文件,在头文件中的Private段增加对成员函数CaptureMessage的声明:

class TForm1 : public TForm
{
__published:
private:
void __fastcall CaptureMessage(tagMSG &Msg,bool &Handled);
public:
__fastcall TForm1(TComponent* Owner);
};

---- 在.cpp文件中增加CaptureMessage的定义:

void __fastcall TForm1::CaptureMessage(tagMSG &Msg,bool &Handled)
{
if(Msg.message= =WM_SYSCOMMAND && Msg.wParam= =SC_SCREENSAVE)
Handled=true; //阻止屏幕保护的启动
else
Handled=false; //进行该消息的缺省处理
}

---- 再将定义好的CaptureMessage函数作为OnMessage事件的事件处理器,将以下代码加到主窗体的OnCreate事件处理器中:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnMessage=CaptureMessage;
}

---- 按F9编译并运行程序,你可以事先将屏幕保护的等待时间设为一个尽可能小的值来检验程序的运行情况。你会发现在程序运行期间,屏幕保护程序将无法被激活,关闭运行的程序后再等待一会儿,屏幕保护程序就会正常出现。以上代码在C++ Builder5、win98环境中运行通过。

amtyuranus 2003-02-20
  • 打赏
  • 举报
回复
关注中,
注册表不用的话

你看看有没有这类的api函数
Behard 2003-02-20
  • 打赏
  • 举报
回复
设置注册表的屏保项中disabled为1
????
这个我当然知道,只是能不能不使用这种方法
penu 2003-02-20
  • 打赏
  • 举报
回复
设置注册表的屏保项中disabled为1
l_clove 2003-02-20
  • 打赏
  • 举报
回复
关注
warton 2003-02-20
  • 打赏
  • 举报
回复
没做过,关注

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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