delphi 自定义消息
delphi 自定义消息
消息描述
Tmsg是 Windows系统用来记录描述一个具体的windows消息的。就是windows 用于封装应用程序及系统程序发生的消息,它是操作系统使用的。
Tmessage 则封装了TMsg的参数,是应用程序响应的消息。该消息记载了消息的编号,最重要的就是它携带的两个参数。一般接收对象要定义处理句柄,然后对收到的消息 进行处理。如果不定义处理句柄,就交给祖先类去处理。我们在应用程序中使用的是TMessage 消息,而不是TMsg消息。
消息结构
Windows消息结构---Tmsg:
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
delphi消息结构---Tmesssage:
TMessage = packed record
Msg: Cardinal;
case Integer of
0: (
WParam: Longint;
LParam: Longint;
Result: Longint);
1: (
WParamLo: Word;
WParamHi: Word;
LParamLo: Word;
LParamHi: Word;
ResultLo: Word;
ResultHi: Word);
end;
其中Integer是个判断变量条件,0和1只是为了给变体字段分组,0部分的三个字段和1部分的六个字段共享一段 内存。这段内存大小是12个字节,你要么用WParam, LParam...来访问,要么用WparamLo,WParamHi来访问。用不到0和1这两个值的,他们仅仅为可读性而存在。
也可以用:
case Boolean of
False:(...);
True:(...);
我们知道一个32位整数在内存中是高字节在后,低字节在前,因此,WParamLo被对应到WParam的低16位,WParamHi被对应到WParam的高16位。依次类推。
实例:
当程序运行到 sendmessage(Form1.handle,WM_User+100,0,0)时,
操作系统就把这个消息进行描述,填入TMsg的一个结构中,大概是这样:
AMsg:TMsg;
AMsg.handle:=Form1.handle
AMsg.message:=WM_User+100
AMsg.WParam:=0
Amsg.lparam:=0;
Amsg.time:=Getsystemtime();
Amsg.pt:=mouse.CursorPos;
然后再把这个消息重新封装,提取它里面的参数,发送给Form1.handle 所在的消息队列,有
form1.handle 所在的wndproc过程进行处理。
形式如下:
msg:Tmessage;
Msg.msg:=Amsg.Message( WM_User+100)
Msg.lparam:=Amsg.lparam
msg.wparam;=Amsg.wparam
然后 put Msg to Form1 消息队列 ,由form1的窗体过程处理。
Delphi用户定义消息:
Delphi中用户定义的消息大小必须是128bit,也就是16字节。
Delphi在接受到Tmesssage后,会自动把该消息转换成用户定义的消息结构
实例:
procedure CMSocketMessage(var Message: TCMSocketMessage); message CM_SOCKETMESSAGE;
CM_SOCKETMESSAGE消息触发CMSocketMessage函数,
CM_SOCKETMESSAGE消息是Tmesssage结构。
TCMSocketMessage是用户自定义消息机构,结构如下:
TCMSocketMessage = record
Msg: Cardinal;
Socket: TSocket;
SelectEvent: Word;
SelectError: Word;
Result: Longint;
end;
delphi自动进行如下转换
TCMSocketMessage .Msg=Tmessage.Msg
TCMSocketMessage.Socket=Tmessage.WParam
TCMSocketMessage.SelectEvent=地位字段(Tmessage.Lparam);
TCMSocketMessage.SelectError=高位字段(Tmessage.Lparam);
TCMSocketMessage.Result =Tmessage.Result
delphi 自定义消息的更多相关文章
- Delphi自定义消息应用及delphi托盘实现
Delphi自定义消息应用及delphi托盘实现interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Co ...
- 深入delphi编程理解之消息(二)发送消息函数及消息编号、消息结构体的理解
一.delphi发送消息的函数主要有以下三个: (一).SendMessage函数,其原型如下: function SendMessage( hWnd: HWND; {目标句柄} Msg: UINT; ...
- Delphi 使用自定义消息
Delphi 使用自定义消息 1.先用Const 定义一个常量,例如 const WM_MyMessage=WM_USER+$200; 2.在要实现的unit中定义一个私有方法 procedure ...
- DELPHI中自定义消息的发送和接收
DELPHI中的消息处理机制 Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpasca ...
- 利用消息机制实现VC与Delphi之间的通讯(发送自定义消息)
摘要: 本文介绍了使用Windows消息机制实现由不同语言编制的程序之间的相互通讯.联系,并以当前较为流行的两种语言Microsoft Visual C++ 6.0和Borland delphi 5. ...
- Delphi Berlin 10.1.2 FMX用TMessageManager处理自定义消息
看FMX代码,发现有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法. 早前,看过文章说TMessageManage ...
- Delphi 关键字详解[整理于 "橙子" 的帖子]
absolute //它使得你能够创建一个新变量, 并且该变量的起始地址与另一个变量相同. var Str: ]; StrLen: Byte absolute Str; //这个声明指定了变量 ...
- Delphi常用关键字用法详解
本文详细介绍了Delphi中常用的各个关键字名称及用法,供大家在编程过程中借鉴参考之用.详情如下: absolute: ? 1 2 3 4 5 6 7 8 9 10 //它使得你能够创建一个新变量, ...
- delphi如何让程序最小化到任务栏(转)
现在很多的应用程序都有这样一种功能,当用户选择最小化窗口时,窗口不是象平常那样最小化到任务栏上,而是“最小化”成一个任务栏图标.象FoxMail 3.0 NetVampire 3.0等都提供了这样的功 ...
随机推荐
- padding与margin的差别
之前一直没有搞懂android:padding和android:layout_margin的差别,事实上概念非常easy,padding是站在父view的角度描写叙述问题,它规定它里面的内容必须与这个 ...
- 实现nodejs的promises库(基于promise.js改写)
原promise.js库地址:https://github.com/stackp/promisejs promises是JavaScript实现优雅编程的一个非常不错的轻量级框架.该框架可以让你从杂乱 ...
- php 链式操作的实现 学习记录
php 面向对象中实现链式操作的关键部分:调用的方法中返回当前对象 ,从而实现链式操作: <?php namespace commom; class db { public function w ...
- Linux学习笔记共享
从学习到现在,已经3个月了,还有不到一个月linux课程就要结束,大概的情况如下: 预科一周,主要是学习了网络,思科的内容 linux基础课程,从无到有 linux shell 脚本 linux项目实 ...
- spring 读取properties的两种方法
一:直接使用context命名空间 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi= ...
- python环境准备
一.环境准备. 1.安装python3.5.2(勾选环境变量),python2.7.12 2.设置环境变量 (要求命令行输入python,进入python2命令行,打python3时,进入python ...
- Day2 - Python基础2 列表、字典、集合
Python之路,Day2 - Python基础2 本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一, ...
- ASP.NET-FineUI开发实践-15
1.按条件控制Grid不可编辑 Grid编辑其实用到的不多...但是也有要控制权限或者其他条件不能编辑的情况其实挺简单,学过extjs的知道,我现在也只是写前台了,没有写到后台事件,有时间再说 ...
- mvc存储Cookie和读取Cookie方法
mvc存储Cookie和读取Cookie方法: //存储 HttpCookie cookie = new HttpCookie("User"); System.Text.Encod ...
- Directive Definition Object
不知道为什么这个我并没有想翻译过来的欲望,或许我并没有都看熟透,不好误人子弟,原版奉上. Here's an example directive declared with a Directive D ...