
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环境中运行通过。