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

最新文章

  1. 用友NC开发的ListView切换成FormEdit
  2. Myeclipse下的struts2.3.8 配置 保证绝对好用
  3. Collaborative filtering
  4. sc7731 Android 5.1 LCD驱动简明笔记之二
  5. Hapoop原理及MapReduce原理分析
  6. Android5.0之TextInputLayout、FloatingActionButton的使用
  7. Cocos2d-x 3.1.1 学习日志4--cocos2d-x解决中文乱码问题的几种办法
  8. 淘宝分布式数据层:TDDL[转]
  9. myeclipse maven编译出错
  10. Java自带的性能监测工具用法简介——jstack、jconsole、jinfo、jmap、jdb、jsta、jvisualvm
  11. MVC3+EF4.1学习系列(四)----- ORM关系的处理
  12. 第十一节,编辑器软件PyCharm 5.0.3
  13. mac下git配置和jenkins打包
  14. 基于Python实现matplotlib中动态更新图片(交互式绘图)
  15. Android中文API (110) —— CursorTreeAdapter
  16. javascript中的浅拷贝ShallowCopy与深拷贝DeepCopy
  17. vue.js响应式原理解析与实现—实现v-model与{{}}指令
  18. 【版本管理】自定义git
  19. 18 网络编程-TCP/IP各层介绍(5层模型讲解)
  20. Python3 pow() 函数

热门文章

  1. 常用网站开发类Firefox扩展插件 (转)
  2. 自己动手打造html5星际迷航!
  3. linux命令find应用
  4. JQuery 的基本命令
  5. python学习day8
  6. 合成孔径雷达(Synthetic Aperture Radar, SAR)
  7. QP在STM32F10X上第一个应用
  8. StrPCopy与StrPas功能正好相反,作用是与C语言字符串和Delphi的String相互转化
  9. 解决C/C++程序执行一闪而过的方法(三种办法)
  10. Easyui tree 开启拖放后 在IE下 性能惨不忍睹