TApplication类型的OnMessage事件

TApplication类型的OnMessage事件

消息处理的技术,可以通过使用TApplication的OnMessage事件来处理消息。我们可以指将一个过程指向OnMessage,当应用程序从消息队列中取出一条消息,关准备处理该消息时就会调用该过程。应用程序在Windows处理这条消息前,调用这个事件处理过程。
Application.OnMessage事件处理过程是TMessageEvent类型,并且定义该过程时,需要带一个参数列表。如:
   procedure SomeObject.AppMessageHandler(var Msg:TMsg;var Handled:Boolean);
   begin
      //doSth;
   end;

这里会将队列里的所有消息填入到Msg参数中,再传递给OnMessage事件处理过程。
注意这个参数是Windows TMsg记录(结构体)类型的,而Handled参数取值为Boolean类型,它表示是否已经处理了这个消息。

Demo1 清单
//  可以从组件选项板中选择 TApplicationEvents[AppEvnts] 组件,
//  从而创建一个OnMessage事件处理过程。
  begin
   var 
     NumMessage : Integer;
			
   //对所有消息函数的过滤	
   procedure TForm1.ApplicationEvents1Message(var Msg : TMsg;var Handled : Boolean);
   begin
     inc(NumMessage);
     Handled = false;
   end;
		
   procedure TForm1.FormCreate(Sender: TObject);
   begin
      Application.OnMessage := ApplicationEvents1Message;
   end;		
  end.


Demo2清单
//自定义过程函数
  begin	 
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnMessage := WinMsg;
    end;		
    Procedure Tform1.WinMsg (Var Msg : TMsg; Var Handled : Boolean);
    Begin
      //对WM_SYSCOMMAND该消息处理
       If Msg.Message = WM_SYSCOMMAND Then
        If Msg.WParam = ItemID1 Then
        begin
          ShowMessage('My menu!');
        Exit;
        end;
    End;		
  end.	


提示:OnMessage的惟一限制就是它能处理的消息只有从消息队列取出的消息,而不能处理应用程序中直接发给Windows窗体过程的消息。

注意:OnMessage过程中会接受到应用所有Windows发送的消息。它是应用程序中最繁忙的事件处理过程(1秒钟约有上千条消息),因此不要在OnMessage过程中做耗时的工作,否则会把应用程序变得很慢。很显然,在这个过程中设置断点来调试程序也是很是明智的。

[摘自:<<Delphi6 开发人员指南>> 一本值得推荐的书!]

猜你喜欢

转载自qson.iteye.com/blog/1135596