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

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

  1. Delphi中window消息截获的实现方式(2)

    Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpascal)语言,并有强大的数据库引擎 ...

  2. Delphi中window消息截获的实现方式(1)

    近来笔者在一个项目中需要实现一个功能:模仿弹出菜单的隐藏方式,即鼠标在窗口的非PanelA区域点击时,使得PanelA隐藏.   经过思考,笔者想到通过处理鼠标的点击事件来实现相应功能.但是,究竟由谁 ...

  3. delphi中Time消息的使用方法

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  4. Delphi中TStringList类常用属性方法详解

    TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText 2.Delim ...

  5. Delphi中的消息 (转载)

    消息是Windows发出的一个通知,它告诉应用程序某个事件发生了.在Delphi中,大多数情况下Windows的消息被封装在VCL的事件中,我们只需处理相应的VCL事件就可以了,但如果我们需要编写自己 ...

  6. Delphi中文件流的使用方法

    在Delphi中,所有流对象的基类为TStream类, 其中定义了所有流的共同属性和方法.TStream类中定义的属性介绍如下: 1.Size: 此属性以字节返回流中数据大小. 2.Position: ...

  7. delphi中使用自定义资源的方法

    如果要在delphi中使用自定义资源文件*.res文件,比如一个光标,此时可以采用下列步骤: 1,创建包含相应的资源文件,这里是创建一个包含自定义光标的res文件. 2,在主窗体的pas文件中加入编译 ...

  8. Delphi中Interface接口的使用方法

    示例注释(现在应该知道的): {   1.接口命名约定 I 起头, 就像类从 T 打头一样.   2.接口都是从 IInterface 继承而来; 若是从根接口继承, 可省略.   3.接口成员只能是 ...

  9. Floodlight 中创建消息对象的方法

            在 floodlight 中创建各种openflow message 和 action 等採用的是简单工厂方式.BasicFactory类(实现OFMessageFactory接口.) ...

随机推荐

  1. Android识别图片中脸部信息

    在Android开发中,大部分应用都是以用户为第一位,用户都有自己的个人中心,用来展示自己的信息,头像无疑是展示自己最直观的方式,随着各种政策的出台,实名认证,真人头像变得尤为重要,如果要求上传真人头 ...

  2. 优酷播放器demo

    <!DOCTYPE html> <html lang="en-US"> <head> <meta http-equiv="Con ...

  3. HeadFirst设计模式读书笔记--目录

    HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...

  4. 你应该知道的CSS文字大小单位PX、EM、PT[转]

    摘要: 这里引用的是Jorux的“95%的中国网站需要重写CSS”的文章, 题目有点吓人,但是确实是现在国内网页制作方面的一些缺陷.我一直也搞不清楚px与em之间的关系和特点,看过以后确实收获很大.平 ...

  5. LoadRunner 技巧之THML 与 URL两种录制模式分析

    Loadrunner的Virtual User Generator 提供人脚本的录制功能,对于初学者来说,这大大的降低了编写脚本的门槛,loadrunner提供两种录制脚本的方式:Html_based ...

  6. tcpdump 抓包让wireshark来分析

    在linux下面用tcpdump 抓包非常方便, 但是抓的包要提取出来进行分析, 还是得用wireshark来过滤分析比较方便. 下面先介绍一下 TCPDUMP 的使用 例:tcpdump host ...

  7. Ubuntu下Eclipse搭建ARM开发环境

    第一步:安装JRE 和 Eclipse 详细步骤请参考:http://blog.csdn.net/ex_net/article/details/7251664 第二步:安装arm-linux-gcc ...

  8. poj 1157 LITTLE SHOP_简单dp

    题意:给你n种花,m个盆,花盆是有顺序的,每种花只能插一个花盘i,下一种花的只能插i<j的花盘,现在给出价值,求最大价值 简单dp #include <iostream> #incl ...

  9. hdu 4711 Weather概率dp

    http://acm.hdu.edu.cn/showproblem.php?pid=4711 真的是坑吐血了,wa了5次  最后实在无语 把long long double 改成long double ...

  10. PHP - Mysql数据库备份类

    使用方法: require_once("backdata.class.php"); $link =@mysql_connect("localhost",&quo ...