消息处理
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方法对消息进行最后的处理。
以上是关于消息处理的主要内容,如果未能解决你的问题,请参考以下文章