一、delphi发送消息的函数主要有以下三个:

 (一)、SendMessage函数,其原型如下:

function SendMessage(
hWnd: HWND; {目标句柄}
Msg: UINT; {要发送的消息(编号)}
wParam: WPARAM; {消息参数}
lParam: LPARAM {消息参数}
): LRESULT; stdcall; {返回处理结果}

 (二)、PostMessage函数

function PostMessage(
hWnd: HWND; {目标句柄}
Msg: UINT; {要发送的消息(编号)}
wParam: WPARAM; {消息参数}
lParam: LPARAM {消息参数}
): BOOL; stdcall; {是否发送成功}

(三)、Perform 函数

function Perform(
Msg: Cardinal; {要发送的消息(编号)}
WParam: WPARAM; {消息参数}
LParam: LPARAM {消息参数}
): LRESULT; {返回处理结果}

  SendMessage和PostMessage是API函数,Perform是delphi从TControl类开始定义的方法,所有从TControl继承的子类对象都可以使用。SendMessage和Perform方法,发送消息后,要等系统回馈结果后才执行下一步操作,而PostMessage函数则只管发送消息,发送消息后程序会马上执行下一步代码。

二、delphi 消息编号(Msg)规则及参数结构理解

(一)、消息编号

  消息编号是window或者用户为各种不同消息定义唯一编号,他其实就是无符号整数(Cardinal),为了便于理解, delphi以常量形式对每一个数字进行定义,主要有以下几种形式:

   1、windows消息,以WM_为前缀,如WM_CLOSE为窗口关闭消息;

2、delphi自定义消息,以CM_、CN为前缀;

  3、用户自定义消息 以WM_USER基数,如  Const MyMessage=WM_USER+1;

定义消息编号主要作用是定位消息处理函数,作为message关键字的识别码,例如以下函数头的定义:

 procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;

以上函数头定义了WM_KEYDOWN消息编号,其常量数值为 WM_KEYDOWN= $0100,其作用就是当窗口接受到编号为$100的消息就执行WMKeyDown这个函数。

(二)、消息结构体

         消息结构体一般作为消息函数的参数类型出现,如上例中的TWMKeyDown就是一个消息结构体。消息结构体的标准定义如下:

PMsg = ^TMsg;
tagMSG = packed record
hwnd: HWND;
message: UINT;
wParam: WPARAM;
lParam: LPARAM;
time: DWORD;
pt: TPoint;
end;
TMsg = tagMSG;
MSG = tagMSG;

这种标准结构体与delphi VCL消息结构体并不兼容,所以delphi定义了自己的消息结构体。

PMessage = ^TMessage;
TMessage = packed record
Msg: Cardinal; {消息编号}
case Integer of
0: (
WParam: WPARAM;
LParam: LPARAM;
Result: LRESULT);
1: (
WParamLo: Word;
WParamHi: Word;
LParamLo: Word;
LParamHi: Word;
ResultLo: Word;
ResultHi: Word);
end;

  在我们实际使用中,虽然标准的结构体可以满足我们的使用,但由于使用过程中我们还要进行数据转换,为了更加便捷和易于理解,delphi在message单元文件中为我们定义大量的消息结构体,供我们直接调用。

TWMNoParams
TWMCancelMode = TWMNoParams;
TWMChildActivate = TWMNoParams;
TWMClear = TWMNoParams;
TWMClose = TWMNoParams;
TWMCopy = TWMNoParams;
TWMCut = TWMNoParams;
TWMDestroy = TWMNoParams;
TWMDestroyClipboard = TWMNoParams;
TWMDrawClipboard = TWMNoParams;
TWMFontChange = TWMNoParams;
TWMGetDlgCode = TWMNoParams;
TWMGetFont = TWMNoParams;
TWMGetHotKey = TWMNoParams;
TWMGetTextLength = TWMNoParams;
TWMMDIGetActive = TWMNoParams;
TWMMDIIconArrange = TWMNoParams;
TWMMDIRefreshMenu = TWMNoParams;
TWMNCDestroy = TWMNoParams;
TWMPaintIcon = TWMNoParams;
TWMPaste = TWMNoParams;
TWMQueryDragIcon = TWMNoParams;
TWMQueryNewPalette = TWMNoParams;
TWMQueryOpen = TWMNoParams;
TWMQueueSync = TWMNoParams;
TWMRenderAllFormats = TWMNoParams;
TWMSysColorChange = TWMNoParams;
TWMTimeChange = TWMNoParams;
TWMQueryUIState = TWMNoParams;
TWMUndo = TWMNoParams;
TWMKey
TWMChar = TWMKey;
TWMKeyDown = TWMKey;
TWMKeyUp = TWMKey;
TWMDeadChar = TWMChar;
TWMSysChar = TWMKey;
TWMSysKeyDown = TWMKey;
TWMSysKeyUp = TWMKey;
TWMMouse
TWMLButtonDblClk = TWMMouse;
TWMLButtonDown = TWMMouse;
TWMLButtonUp = TWMMouse;
TWMMButtonDblClk = TWMMouse;
TWMMButtonDown = TWMMouse;
TWMMButtonUp = TWMMouse;
TWMMouseMove = TWMMouse;
TWMRButtonDblClk = TWMMouse;
TWMRButtonDown = TWMMouse;
TWMRButtonUp = TWMMouse;
TWMMouseWheel
TMSHMouseWheel
TWMWindowPosMsg
TWMWindowPosChanged = TWMWindowPosMsg;
TWMWindowPosChanging = TWMWindowPosMsg;
TWMScroll
TWMHScroll = TWMScroll;
TWMVScroll = TWMScroll;
TWMActivate
TWMActivateApp
TWMAskCBFormatName
TWMChangeCBChain
TWMCharToItem
TWMVKeyToItem = TWMCharToItem;
TWMChooseFont_GetLogFont
TWMCommand
TWMCompacting
TWMCompareItem
TWMCopyData
TWMCreate
TWMCtlColor
TWMCtlColorBtn = TWMCtlColor;
TWMCtlColorDlg = TWMCtlColor;
TWMCtlColorEdit = TWMCtlColor;
TWMCtlColorListbox = TWMCtlColor;
TWMCtlColorMsgbox = TWMCtlColor;
TWMCtlColorScrollbar = TWMCtlColor;
TWMCtlColorStatic = TWMCtlColor;
TWMDDE_Ack
TWMDDE_Advise
TWMDDE_Data
TWMDDE_Execute
TWMDDE_Initiate
TWMDDE_Poke
TWMDDE_Request
TWMDDE_Terminate
TWMDDE_Unadvise
TWMDeleteItem
TWMDevModeChange
TWMDrawItem
TWMDropFiles
TWMEnable
TWMEndSession
TWMEnterIdle
TWMEnterMenuLoop
TWMExitMenuLoop = TWMEnterMenuLoop;
TWMEraseBkgnd
TWMGetIcon
TWMGetMinMaxInfo
TWMGetText
TWMHotKey
TWMHScrollClipboard
TWMIconEraseBkgnd = TWMEraseBkgnd;
TWMInitDialog
TWMInitMenu
TWMInitMenuPopup
TWMKillFocus
TWMMDIActivate
TWMMDICascade
TWMMDICreate
TWMMDIDestroy
TWMMDIMaximize
TWMMDINext
TWMMDIRestore
TWMMDISetMenu
TWMMDITile
TWMMeasureItem
TWMMenuChar
TWMMenuSelect
TWMMouseActivate
TWMMove
TWMMoving
TWMNCActivate
TWMNCCalcSize
TWMNCCreate
TWMNCHitTest
TWMNCHitMessage
TWMNCLButtonDblClk = TWMNCHitMessage;
TWMNCLButtonDown = TWMNCHitMessage;
TWMNCLButtonUp = TWMNCHitMessage;
TWMNCMButtonDblClk = TWMNCHitMessage;
TWMNCMButtonDown = TWMNCHitMessage;
TWMNCMButtonUp = TWMNCHitMessage;
TWMNCMouseMove = TWMNCHitMessage;
TWMNCRButtonDblClk = TWMNCHitMessage;
TWMNCRButtonDown = TWMNCHitMessage;
TWMNCRButtonUp = TWMNCHitMessage;
TWMNCPaint
TWMNextDlgCtl
TWMNotify
TWMNotifyFormat
TWMPaint
TWMPaintClipboard
TWMPaletteChanged
TWMPaletteIsChanging
TWMParentNotify
TWMPower
TWMQueryEndSession
TWMQuit
TWMRenderFormat
TWMSetCursor
TWMSetFocus
TWMSetFont
TWMSetHotKey
TWMSetIcon
TWMSetRedraw
TWMSetText
TWMShowWindow
TWMSize
TWMSizeClipboard
TWMSpoolerStatus
TWMStyleChange
TWMStyleChanged = TWMStyleChange;
TWMStyleChanging = TWMStyleChange;
TWMSysCommand
TWMSysDeadChar
TWMSystemError
TWMTimer
TWMUIState
TWMChangeUIState = TWMUIState;
TWMUpdateUIState = TWMUIState;
TWMVScrollClipboard
TWMWinIniChange
TWMSettingChange
TWMHelp
TWMDisplayChange
TWMContextMenu
TWMPrint
TWMPrintClient = TWMPrint;

深入delphi编程理解之消息(二)发送消息函数及消息编号、消息结构体的理解的更多相关文章

  1. Linux进程调度与源码分析(二)——进程生命周期与task_struct进程结构体

    1.进程生命周期 Linux操作系统属于多任务操作系统,系统中的每个进程能够分时复用CPU时间片,通过有效的进程调度策略实现多任务并行执行.而进程在被CPU调度运行,等待CPU资源分配以及等待外部事件 ...

  2. C++ 结构体指针理解

    上一篇基础链接https://www.cnblogs.com/xuexidememeda/p/12283845.html 主要说一下链表里面双重指针 先说一下结构体 typedef struct LN ...

  3. 对offsetof、 container_of宏和结构体的理解

    offsetof 宏 #include<stdio.h> #define offsetoff(type, member)      ((int)&((type*)0)->me ...

  4. RabbitMQ,为应对消息从发送到消费,各个环节消息丢失的解决方案

      1.发送方   为保证消息到达exchange,在这个过程中不丢失.  用事务或者发送方确认机制  见<RabbitMQ实战指南>4.8节 2.为保证消息不会因为到达exchange后 ...

  5. jQuery理解之(二)功能函数

    在javascript编程中,开发者通常需要编写很多小程序来实现一些特定的功能.例如浏览器检测,字符串处理.数组的编辑等.jQuery对这些常用的程序进行了总结,提供了很多实用的函数. 1.检测浏览器 ...

  6. 标C编程笔记day04 预处理、宏定义、条件编译、makefile、结构体使用

    预处理:也就是包括须要的头文件,用#include<标准头文件>或#include "自己定义的头文件" 宏定义,如:#define PI 3.1415926 查看用宏 ...

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

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

  8. C语言:使用结构体和指针函数实现面向对象思想(OO编程)

    原文:https://www.linuxidc.com/Linux/2016-12/138789.htm 有关:<C语言:过年回家 发现只有我没有对象> 一.基础研究 观察如下两个程序a. ...

  9. 深入理解指针—>结构体里的成员数组和指针

    单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接.微博截图如 ...

随机推荐

  1. hackme.inndy.tw的一些Writeup(5月30更新)

    hackme.inndy.tw的一些Writeup(6月3日更新) 原文链接:http://www.cnblogs.com/WangAoBo/p/7706719.html 推荐一下https://ha ...

  2. SIFT算法原理(3)-确定关键点的主方位,构建关键点描述符

    介绍官网:https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_sift_intro/py_sift_intro.html ...

  3. 使用Opencv3.2出现l error C4996:fopen

    ------ 已启动生成: 项目: test, 配置: Debug x64 ------1> test.cpp1>e:\vs2015opencv\opencv3.2\opencv\buil ...

  4. CentOS安装RabbitMQ-yum

    CentOS安装RabbitMQ----yum安装 一.安装erlang 由于CentOS没有erlang源,需用 第三方源(http://rpmfusion.org/Configuration) 1 ...

  5. 前端必备 Nginx 配置

    Nginx (engine x) 是一个轻量级高性能的HTTP和反向代理服务器,同时也是一个通用 代理服务器 (TCP/UDP/IMAP/POP3/SMTP),最初由俄罗斯人Igor Sysoev编写 ...

  6. 空指针和NULL

    #include <stdio.h> int add(int a, int b ){ //函数的返回值和参数意一样有副本机制,存储在寄存器中,而不在内存中,函数的返回值不能取地址 & ...

  7. centos 7安装jdk8

    前提 执行安装的当前用户为root 下载安装包 现在oracle官网下载jdk需要登录才可以下载,故下载安装包比较麻烦.下载地址: http://www.oracle.com/technetwork/ ...

  8. echarts修改X、 Y坐标轴字体的颜色

    1.背景:在项目中常常会用到echarts的实例,根据不同的需求字体颜色需要变化,如图,要切合背景,就需要更改字体颜色 2.解决方案 xAxis : [ { type : 'category', da ...

  9. vs2015制作一个超级简单的MVC项目

    使用vs2015制作一个超级简单的MVC项目   本文链接:https://blog.csdn.net/qq_40919762/article/details/100705314 直奔主题一,创建一个 ...

  10. 状态压缩DP入门题

    . /*本题为状态压缩题 题目大意 : 一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧, 可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方 格不能同时放牛(不包括斜着的 ...