定义一个消息需要两个步骤: 1.声明一个消息标识符 2.声明一个消息记录类型

一个消息标识符是一个整数大小的常数。Windows自用低于1024的消息,所以当你声明你自己的消息,你应该开始高于这一数字。 常数WM_APP代表了用户定义的消息开始编号。当定义消息标识符,你应该基于WM_APP它们。(这是因为WM_USER所代表1024以后的消息编号,有一些已经被Windows标准组件占用了,为了避免冲突,使用WM_APP) 如果你想给你的消息一个有用的参数名,你需要声明该消息的消息记录类型。消息记录是传递给消息处理方法的参数类型。如果你不使用消息的参数,或者如果你想使用旧风格的参数表示法(wParam参数,lParam参数,等等),你可以使用默认的消息记录,TMessage,其原型如下:

  TMessage = : (          WParam: Longint;          LParam: Longint;          Result: Longint);        : (          WParamLo: Word;          WParamHi: Word;          LParamLo: Word;          LParamHi: Word;          ResultLo: Word;          ResultHi: Word);    end; 

要声明一个消息记录类型,请按照下列约定: 1.命名消息记录类型,以T开头 2.第一个字段为Msg,为对应的消息 3.定义接下来的两个字节对应Word参数,接下来的两个字节为未使用。 或 接下来的四个字节定义对应于Longint型参数。 4.最后字段添加一个类型为Longint型的Result。 如Delphi源码里面:

  TWMCharToItem = packed record      Msg: Cardinal;      Key: Word;      CaretPos: Word;      ListBox: HWND;      Result: Longint;    end;    TWMCompacting = packed record      Msg: Cardinal;      CompactRatio: Longint;      Unused: Longint;      Result: Longint;    end; 

有不同的方式来发送一个Windows消息,经常使用的是SendMessage和PostMessage,它们原型如下:

function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;  function PostMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall 

其中WPARAM和LPARAM都是Longint。这两个函数参数一样,返回值不同。SendMessage()返回被处理的消息的结果值,但是PostMessage()返回的只是一个布尔值,表示是否该消息被放入到目标窗口队列中。另外一个方面,SendMessage()是同步调用的,PostMessage()是异步调用的。


下面一个例子来说明,如何自定义消息。示例功能为应用程序调用计算器类,当计算器类计算完毕,就发带计算结果的消息给应用程序: 1.新建Delphi 7应用程序,单击菜单栏→File→New→Unit,在弹出的单元文件,输入以下代码:

;   //定义消息    type    TCalc = class(TObject)    private      FFormHandle: HWND;     //接受者的句柄      FOne,FAnother: Integer;    public      constructor Create(AHandle: HWND;AOne,AAnother: Integer);      procedure StartCalc;    end;    implementation    constructor TCalc.Create(AHandle: HWND;AOne,AAnother: Integer);  begin    inherited Create;    FFormHandle := AHandle;    FOne := AOne;    FAnother := AAnother;  end;    procedure TCalc.StartCalc;  var    s: string;  begin    s := '计算结果:';    SendMessage(FFormHandle,WM_CALCOK,FOne + FAnother,LongInt(s));  //进程内发送字符串    //PostMessage(FFormHandle,WM_CALCOK,FOne + FAnother,0);   //不可发送字符串  end;  end. 

2.主窗体上放置2个编辑框和一个按钮,主单元文件代码如下:

;  type    TForm1 = class(TForm)      btn1: TButton;      edt1: TEdit;      edt2: TEdit;      procedure btn1Click(Sender: TObject);    private      FCalc: TCalc;      procedure calcOk(var Msg: TMessage);message WM_CALCOK;    public      { Public declarations }    end;    var    Form1: TForm1;    implementation    {$R *.dfm}    procedure TForm1.btn1Click(Sender: TObject);  begin    FCalc := TCalc.Create(Self.Handle,StrToInt(edt1.Text),StrToInt(edt2.Text));    try      FCalc.StartCalc;    finally      FCalc.Free;    end;  end;    procedure TForm1.calcOk(var Msg: TMessage);  begin    ShowMessage(string(Msg.LParam) + IntToStr(Msg.WParam));  end;  end. 

3.运行程序,结果如下所示:

delphi定义自己的消息的更多相关文章

  1. Delphi里的Windows消息(可查MSDN指定位置)

    各种控件的通知消码和控制消息可由MSDN-> Platform SDK-> User Interface Services->Windows User Interface->C ...

  2. 深入delphi编程理解之消息(二)发送消息函数及消息编号、消息结构体的理解

    一.delphi发送消息的函数主要有以下三个: (一).SendMessage函数,其原型如下: function SendMessage( hWnd: HWND; {目标句柄} Msg: UINT; ...

  3. TMsgThread, TCommThread -- 在delphi线程中实现消息循环

    http://delphi.cjcsoft.net//viewthread.php?tid=635 在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使 ...

  4. TMsgThread, TCommThread -- 在delphi线程中实现消息循环(105篇博客,好多研究消息的文章)

    在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使用很方便,但是有时候我们需要在线程类中使用消息循环,delphi没有提供.   花了两天的事件研究了 ...

  5. WM_PAINT在微软官方定义中,wParam和lParam都没有使用,所以就被Delphi给重定义了这个消息,还增加了DC(Delphi可任意改写消息的结构)

    LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); Parameters wParam ...

  6. 【温故Delphi】之VCL消息机制小结

    TObject消息分派 procedure Dispatch(var Message); virtual; #负责分派消息到特定VCL组件的事件处理函数 procedure DefaultHandle ...

  7. delphi XE7 中的消息

    在delphi XE7的程序开发中,消息机制保证进程间的通信. 在程序中,消息来自: 1)系统: 通知你的程序用户输入,涂画以及其他的系统范围的事件: 2)你的程序:不同的程序部分之间的通信信息.   ...

  8. Delphi窗体间发送消息或字符串

    在Delphi 开发中,常常应用到窗体消息传递,以达成某种操作要求,以下列举一个应用的例子,供大家参考. 自定义过程/函数方法://发送字符串到指字句柄的窗口中 (接收窗体需用发送时的消息常量WM_C ...

  9. 深入delphi编程理解之消息(一)WINDOWS原生窗口编写及消息处理过程

    通过以sdk方式编制windows窗口程序,对理解windows消息驱动机制和delphi消息编程有很大的帮助. sdk编制windows窗口程序的步骤: 1.对TWndClass对象进行赋值; 2. ...

随机推荐

  1. Windows 10 Technical Preview 10041 使用 IIS Express 运行网站应用程序异常

    在 Windows 10 中使用 Visual Studio 2013 Ultimate with Update 4 开发网站,9926 的时候还好好的,升到 10041 就不能调试了: “Syste ...

  2. Java keyword具体解释

    訪问控制修饰符号 1)        private 私有的 private keyword是訪问控制修饰符,能够应用于类.方法或字段(在类中声明的变量). 仅仅能在声明 private(内部)类.方 ...

  3. js控件位置

    function ShowSettingDiv() { var div = document.getElementById('ShowDiv'); //将要弹出的层 div.style.display ...

  4. cidaemon.exe进程cpu占用率高及关闭cidaemon.exe进程方法

    问题描写叙述:   这段时间机器总是出现一个奇怪的问题:cidaemon.exe进程占用CUP率98%以上,大大影响了电脑的正常使用.资源管理器中出现多个cidaemon.exe进程,强制结束占用cp ...

  5. HTML表单介绍

    表单语法结构如下: <form action="url" method="get|post" name="value" enctype ...

  6. Java基础知识强化之集合框架笔记43:Set集合之TreeSet存储Integer类型的元素并遍历

    1. TreeSet类概述: • 能够对元素按照某种规则进行排序. • 或者根据创建set时提供的Comparator进行排序 • 具体取决于使用的构造方法 2. 代码示例: package cn.i ...

  7. 规范javascript书写

    空白 缩进 换行限制 if while for do 2.  命名 常量 URL_CONFIG 变量 listLen 函数命名 调用函数  function setStyle(dom, name, v ...

  8. centos6.5 64位 openvpn安装配置

    1 查看系统版本 2 cat /etc/redhat-release 3 CentOS release 6.5 (Final) 4 5 查看内核和cpu架构 6 uname -rm 7 2.6.32- ...

  9. 怎么捕获和记录SQL Server中发生的死锁

    我们知道,可以使用SQL Server自带的Profiler工具来跟踪死锁信息.但这种方式有一个很大的敝端,就是消耗很大.据国外某大神测试,profiler甚至可以占到服 务器总带宽的35%,所以,在 ...

  10. HashMap HashTable HashSet

    原文转载自 http://blog.csdn.net/wl_ldy/article/details/5941770 HashMap是新框架中用来代替HashTable的类 也就是说建议使用HashMa ...