• 消息处理


     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方法对消息进行最后的处理。

  • 相关阅读:
    CF219D
    HDU 4259 Double Dealing 数学题
    HDU1599 find the mincost route 最小环
    HDU3592 World Exhibition 排队判断3种情况
    POJ3694 Network 加边查询剩余桥的个数
    Flex 如何获得Tree 拖动节点的起始位置
    wcf webconfig配置
    学JS面向对象 以及里面的继承
    sqlserver 几种查询耗时
    ubuntu更改文件夹属性
  • 原文地址:https://www.cnblogs.com/maweiwei/p/12173083.html
Copyright © 2020-2023  润新知