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
Delphi中的消息截获(六种方法:Hook,SubClass,Override WndProc,Message Handler,RTTI,Form1.WindowProc:=@myfun)good的更多相关文章
- Delphi中window消息截获的实现方式(2)
Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpascal)语言,并有强大的数据库引擎 ...
- Delphi中window消息截获的实现方式(1)
近来笔者在一个项目中需要实现一个功能:模仿弹出菜单的隐藏方式,即鼠标在窗口的非PanelA区域点击时,使得PanelA隐藏. 经过思考,笔者想到通过处理鼠标的点击事件来实现相应功能.但是,究竟由谁 ...
- delphi中Time消息的使用方法
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- Delphi中TStringList类常用属性方法详解
TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText 2.Delim ...
- Delphi中的消息 (转载)
消息是Windows发出的一个通知,它告诉应用程序某个事件发生了.在Delphi中,大多数情况下Windows的消息被封装在VCL的事件中,我们只需处理相应的VCL事件就可以了,但如果我们需要编写自己 ...
- Delphi中文件流的使用方法
在Delphi中,所有流对象的基类为TStream类, 其中定义了所有流的共同属性和方法.TStream类中定义的属性介绍如下: 1.Size: 此属性以字节返回流中数据大小. 2.Position: ...
- delphi中使用自定义资源的方法
如果要在delphi中使用自定义资源文件*.res文件,比如一个光标,此时可以采用下列步骤: 1,创建包含相应的资源文件,这里是创建一个包含自定义光标的res文件. 2,在主窗体的pas文件中加入编译 ...
- Delphi中Interface接口的使用方法
示例注释(现在应该知道的): { 1.接口命名约定 I 起头, 就像类从 T 打头一样. 2.接口都是从 IInterface 继承而来; 若是从根接口继承, 可省略. 3.接口成员只能是 ...
- Floodlight 中创建消息对象的方法
在 floodlight 中创建各种openflow message 和 action 等採用的是简单工厂方式.BasicFactory类(实现OFMessageFactory接口.) ...
随机推荐
- iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案
问题描述 iOS系统下,移动web页面,inpu获取焦点弹出系统虚拟键盘时,偶尔会出现挡住input的情况,尽管概率不大,但是十分影响用户体验. 问题重现 原始页面:页面中有header.main.f ...
- 在右键添加Cmder here选项,添加启动Cmder的快捷键
右键菜单添加“Cmder here” 打开cmder,在其中输入: cmder /register user 或 cmder /register all 即可 设置启动cmder的快捷键 右键 C ...
- JAVA中synchronized和lock详解
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronize ...
- 【写一个自己的js库】 2.实现自己的调试日志
还是本着学习的目的,实现一个自己的调试日志,界面很简单,就是将调试信息显示在页面的正中央,用一个ul包裹,每条信息就是一个li. 1.新建一个myLogger.js文件,将需要的方法声明一下.其中va ...
- HttpClient post 请求实例
所需jar包: commons-codec-1.3.jar commons-httpclient-3.0.jar commons-logging-1.1.1.jar /** * */ package ...
- Android的数据存储方式(转)
数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 ...
- (续)顺序表之单循环链表(C语言实现)
单循环链表和单链表的唯一区别在于单循环链表的最后一个节点的指针域指向第一个节点, 使得整个链表形成一个环. C实现代码如下: #include<stdio.h> typedef struc ...
- win7 Visual Studio 2008 安装程序时出现“ 加载安装组件时遇到问题。取消安装。”处理方法
win7 Visual Studio 2008 安装程序时出现“ 加载安装组件时遇到问题.取消安装.”处理方法 vs2008试用期到期,卸载.重新安装都会出现“ 加载安装组件时遇到问题.取消安装.”无 ...
- 具体解释HTML中的window对象和document对象
Window -- 代表浏览器中一个打开的窗体: 对象属性 window //窗体自身 window.self //引用本窗户window=window.self window.name //为窗体命 ...
- 基于Mesos运行Spark
背景介绍 Spark有多种集群运行模式,例如:Standalone,Yarn,Mesos. 下面就说一下如何在Mesos上运行Spark,这也是官方推荐的一种运行方式. 在运行Sp ...