Delphi中的消息截获

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




本文转自 byteh 51CTO博客,原文链接:http://blog.51cto.com/byteh/71913,如需转载请自行联系原作者

目录
相关文章
|
Linux Shell
【Shell脚本】Linux安装Nexus的两种方式以及开机自启
【Shell脚本】Linux安装Nexus的两种方式以及开机自启
|
API 开发者 Python
Pygame Zero(pgzrun)详解(简介、使用方法、坐标系、目录结构、语法参数、安装、实例解释)
Pygame Zero(pgzrun)详解(简介、使用方法、坐标系、目录结构、语法参数、安装、实例解释)
2284 17
|
存储 数据安全/隐私保护 Windows
逆向学习Windows篇:进程句柄操作详解
逆向学习Windows篇:进程句柄操作详解
874 1
|
网络协议 Linux Unix
面试官:服务器最大可以创建多少个tcp连接以及端口并解释下你对文件句柄的理解
面试官:服务器最大可以创建多少个tcp连接以及端口并解释下你对文件句柄的理解
407 0
面试官:服务器最大可以创建多少个tcp连接以及端口并解释下你对文件句柄的理解
|
JavaScript Linux iOS开发
|
数据库 数据安全/隐私保护 C++
Python并发编程实战:线程(threading)VS进程(multiprocessing),谁才是并发之王?
【7月更文挑战第10天】Python并发对比:线程轻量级,适合I/O密集型任务,但受GIL限制;进程绕过GIL,擅CPU密集型,但通信成本高。选择取决于应用场景,线程利于数据共享,进程利于多核利用。并发无“王者”,灵活运用方为上策。
450 2
|
容器 Docker Java
|
网络协议 安全 Unix
socat神器解密:网络数据传输的利器
socat神器解密:网络数据传输的利器
1448 1
|
负载均衡 Java 应用服务中间件
Ribbon、Feign和OpenFeign的区别来了
Ribbon、Feign和OpenFeign的区别来了
1065 2
|
机器学习/深度学习 自然语言处理 搜索推荐
推荐系统的算法分类和操作流程介绍
推荐系统的算法分类和操作流程介绍