深入delphi编程理解之消息(二)发送消息函数及消息编号、消息结构体的理解
一、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编程理解之消息(二)发送消息函数及消息编号、消息结构体的理解的更多相关文章
- Linux进程调度与源码分析(二)——进程生命周期与task_struct进程结构体
1.进程生命周期 Linux操作系统属于多任务操作系统,系统中的每个进程能够分时复用CPU时间片,通过有效的进程调度策略实现多任务并行执行.而进程在被CPU调度运行,等待CPU资源分配以及等待外部事件 ...
- C++ 结构体指针理解
上一篇基础链接https://www.cnblogs.com/xuexidememeda/p/12283845.html 主要说一下链表里面双重指针 先说一下结构体 typedef struct LN ...
- 对offsetof、 container_of宏和结构体的理解
offsetof 宏 #include<stdio.h> #define offsetoff(type, member) ((int)&((type*)0)->me ...
- RabbitMQ,为应对消息从发送到消费,各个环节消息丢失的解决方案
1.发送方 为保证消息到达exchange,在这个过程中不丢失. 用事务或者发送方确认机制 见<RabbitMQ实战指南>4.8节 2.为保证消息不会因为到达exchange后 ...
- jQuery理解之(二)功能函数
在javascript编程中,开发者通常需要编写很多小程序来实现一些特定的功能.例如浏览器检测,字符串处理.数组的编辑等.jQuery对这些常用的程序进行了总结,提供了很多实用的函数. 1.检测浏览器 ...
- 标C编程笔记day04 预处理、宏定义、条件编译、makefile、结构体使用
预处理:也就是包括须要的头文件,用#include<标准头文件>或#include "自己定义的头文件" 宏定义,如:#define PI 3.1415926 查看用宏 ...
- 深入delphi编程理解之消息(一)WINDOWS原生窗口编写及消息处理过程
通过以sdk方式编制windows窗口程序,对理解windows消息驱动机制和delphi消息编程有很大的帮助. sdk编制windows窗口程序的步骤: 1.对TWndClass对象进行赋值; 2. ...
- C语言:使用结构体和指针函数实现面向对象思想(OO编程)
原文:https://www.linuxidc.com/Linux/2016-12/138789.htm 有关:<C语言:过年回家 发现只有我没有对象> 一.基础研究 观察如下两个程序a. ...
- 深入理解指针—>结构体里的成员数组和指针
单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接.微博截图如 ...
随机推荐
- 开放系统互联(OSI)模型
开放系统互联(OSI)模型 是由国际标准化组织(ISO)于1984年提出的一种标准参考模型,是一种关于由不同供应商提供的不同设备和应用软件之间的网络通信的概念性框架结构.它被公认为是计算机通信和 in ...
- jQuery---版本问题
jQuery的版本 官网下载地址:http://jquery.com/download/ jQuery版本有很多,分为1.x 2.x 3.x 大版本分类: 1.x版本:能够兼容IE678浏览器 2.x ...
- 腾讯云OCR图片文字识别
一. OCR OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别 ...
- 3ds Max File Format (Part 2: The first inner structures; DllDirectory, ClassDirectory3)
Now that we understand the outer structure of the file, it's time to look closer to what's inside. T ...
- markdown文本编辑学习笔记2
目录 1.删除线 2.无序列表 4 todo list 5分割符号 6 TOC自动生成目录 7 插入代码块 8 斜体.粗体.删除线.下划线.背景高亮 markdown编辑公式 1.删除线 ~~要删除的 ...
- ASP.NET MVC4中对JS和CSS的引用
https://www.cnblogs.com/madyina/p/3702314.html ASP.NET MVC4中对JS和CSS的引用又做了一次变化,在MVC3中我们这样引用资源文件: < ...
- RMQ(区间最值问题)
问题: RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大) ...
- TD-在http请求头上添加参数
dojo.xhrGet({ url : url, timeout : easy7.timeout, headers: { iBaseToken: easy7.iBaseToken },
- 2019杭电多校第五场 discrete logarithm problem
https://vjudge.net/contest/317493#problem/I
- Python之旅的开始day1
Python有哪些种类: JPython.IronPython.JavaScriptPython.RubyPython.CPython(即将开始学习种类,最为常见的种类).pypy pypy:这是用C ...