消息处理

Posted maweiwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息处理相关的知识,希望对你有一定的参考价值。

 Delphi中,自定义消息处理过程与Windows消息处理过程的定义是一样的。
1.主用步骤:
1>. 首先定义一个消息标识符常量;如:WM_MYMessage = WM_USER+ 5;(标识符常量的取值范围为WM_USER~WM_APP-1)

2>. 在单元文件中定义消息响应过程和消息标识符常量。

3>. 消息响应过程使用消息类TMessage的变量为参数。

4>. 应定义一个消息标识符变量,变量名必须为Message;因为Message为保留字。

      如: Procedure WMUserHandler(var msg:TMessage);Message WM_MYMessage;
               if msg.Message = WM_MYMessage then begin  处理代码;  end;

5>. 使用PostMessage或SendMessage函数等来发送自定义消息。


2. 发送消息
1>.SendMessage函数:

     该函数用来向目标窗体发送消息。利用该函数发送消息到指定的窗口队列,但不会立即返回,

而是等到发送的消息被处理之后才返回。

例如:通过某组件的句柄获取该组件的文本信息;

var

  texts:array[0..255] of char;

begin

  SendMessage(handle,wm_gettext,@texts,255);

end;

 

2>.PostMessage函数:

      该函数用来向目标窗体发送消息。利用该函数发送消息到指定的窗口队列,然后立即返回,其

返回值是一个布尔值,表示消息是否发送到指定的消息队列中。

例如:通过向TEdit组件发送消息实现在TEdit组件上按一下回车键效果。

      PostMessage(edt1.handle,wm_keydown,VK_return,1);

 

3>.PostThreadMessage函数:

      该函数用于向线程中发送消息,并到指定的线程中,然后立即返回。该函数返回是的一个布尔

值,表示消息是否发送到指定的线程消息队列中。

 

4>.Perform方法:

      该方法声明在TControl类中,适用于使用TControl派生的对象,并可以想任何一个窗体或组件

发送消息。

 

5>.Broadcast方法:

      该方法声明在TWinControl类中,用于向当前组件的所有子组件广播一条消息。

      Procedure Broadcast(var Message);


3.接受消息
消息的接受就是消息的截取。

1>.消息钩子(Message Hook):

   对于钩子来说可以针对所有窗体句柄来截取消息。所以适用性广泛,针对的不仅仅是一个窗

体,而是进程所在的所有窗体的消息。

 

2>.子类化(SubClass):

   简单来说,就是替换窗口过程。该过程使用SetWindowLong(AHandle,GWL_WNDPROC,

Integer(@NewWndProc));SetWindowLong该函数改变指定窗口的属性.函数也将指定的一个32位

值设置在窗口的额外存储空间的指定偏移位置。

 

3>.重载(Override)窗口处理函数WndProc/DefaultHandler:

  protected

     Procedure WndProc(var AMsg:TMessage);override;

 

4>.消息句柄(Message Handler)

   如上面1所示。

 

4.各种消息处理方法的触发顺序
1>. Application.ProcessMessages:

    防止进程阻塞,使程序能够响应消息队列中的其他事件。

 

2>.首先会调用MainWndProc方法来处理该消息。

   Application.OnMessage; MyMessageProc(var Msg:TMsg; var Handle:Boolean)

 

3>.然后把消息传递给WndProc方法处理;

 

4>.消息在WndProc方法中准备派发,最后由Dispatch方法将消息派发给某个消息句柄。

   就是上面1所示定义的方法。

 

5>.处理完之后,DefaultHandler方法对消息进行最后的处理。

以上是关于消息处理的主要内容,如果未能解决你的问题,请参考以下文章

RocketMQ Consumer消息消费过程消息的处理

RocketMQ Consumer消息消费过程消息的处理

wxWidgets源码分析 - 消息处理过程

当所有其他消息完成处理时,Spring集成处理消息

Android 异步消息处理机制

在 ActiveMQ 中存储和处理消息