• Delphi中的消息截获(六种方法:Hook,SubClass,Override WndProc,Message Handler,RTTI,Form1.WindowProc:=@myfun)good


    Windows是一个基于消息驱动的系统,因此,在很多时候,我们需要截获一些消息然后自己进行处理。而VCL系统又有一些特定的消息。下面对我所了解的delphi环境中截获消息进行一些总结。
          就个人了解,共有6种方法来截获/处理消息。

      1. 消息钩子(Message Hook)

        特点:可以针对所有有句柄的窗体,适用性广泛。针对的不仅仅是一个窗口,而是进程所在的所有窗体的消息。

        首先,使用SetWindowsHookEx(WH_CALLWNDPROC, @HookProc, 0, GetCurrentThreadId);挂接消息钩子。当然你也可以根据需要设置其他类型的钩子。

        然后,在HookProc过程中来处理消息。

        function HookProc(nCode: UINT; wPar, lPar: LongInt): LongInt; stdcall;
        begin
          ...
        end;

      2. 子类化(SubClass)

        特点:可以针对所有有句柄的窗体,适用性广泛。仅仅能针对某一个窗口进行消息截获。

        简单的说,就是替换窗口过程。使用SetWindowLong(AHandle, GWL_WNDPROC, Integer(@NewWndProc));

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

         特点:仅仅在VCL中可以使用。而且,必须重新生成一个类。可以截获该类控件的所有消息。

         重载父类的窗口处理过程WndProc,然后在里面处理自己需要的消息。

         TMyControl = class(TControl)
         protected
            procedure WndProc(var AMsg: TMessage); override;
          end;

          procedure TMyControl.WndProc(var AMsg: TMessage);
          begin
            ..
          end;

        4. 消息句柄(Message Handler)

          特点:仅仅在VCL可用。只能针对一些特殊的消息。不能截获所有消息。

          截获特定消息,自定义消息。

          TForm1 = class(TForm)
          ....
          private
            procedure WMPaint(var AMsg: TMessage); message WM_PAINT;
          .....
          end;

          procedure TForm1.WMPaint(var AMsg: TMessage);
          begin
            ...
          end;

        5. RTTI/TypInfo

          特点:仅仅适用于VCL系统。仅仅可以截获特殊方法(publish Method)。

          使用Delphi的RTTI,运行时的类型信息。替换原来的控件消息处理方法。这种方法,只能替换publish出来的属性。

          SetMethodProp();

        6. 自定义消息处理函数。

           特点:仅仅适用VCL系统。可以截获所有消息。

           Form1.WindowProc:= @NewMethod;

          其中,前两种不单可以截获VCL消息,而且,可以截获Windows标准控件的消息。比较通用。

          最后一种方法,可以截获所有VCL消息。

          几种方法是从一般到特殊,当你深入到一种语言的内部的时候,你会发现其实,达到一个目的,不止一条路可以走,不同的路有不同的优缺点。需要根据情况择优选取。

    http://www.lsworks.net/article/39.html

  • 相关阅读:
    postgresql string转decimal后进行排序
    postgresql 自增长ID跳过问题
    携程apollo配置中心服务端如何感知配置更新?
    MATLAB绘制B样条曲线
    BP神经网络
    三次B样条曲线拟合算法
    淘淘IDEA Mavne POM基本配置文件
    slf4j日志的简单用法
    idea测试web连接mysql数据库
    虚拟机如何设置外网ip
  • 原文地址:https://www.cnblogs.com/findumars/p/4999025.html
Copyright © 2020-2023  润新知