荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: FDISK (FDISK-C), 信区: Program
标  题: VC:让应用程序禁止Windows屏幕保护
发信站: BBS 荔园晨风站 (Tue Dec 21 17:51:55 1999), 转信


作者:周新栋

如果在你的程序中需要一个很长的时间段来进行大量的数据处理,这
段时间长得足以使Windows因检测不到用户动作而激活屏幕保护程序,
一旦启动了屏幕保护程序,你的程序运行实际上就变慢了,这会大大
影响程序的正常运行。有没有一种方法,使程序在进行长时间的数据
处理前关掉屏幕保护呢?答案是肯定的。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++ Builder3、win98环境
中运行通过。

(网易IT频道www.163.com/it)

--

※ 来源:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.1.242]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店