windows的消息传递--消息盒子(超详细EM_UNDO等消息)
使用delphi的消息机制可以方便操作后台,其中重要的就是sendmessage()函数。下面讲解一下这个函数
- function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
 
其中四个参数的含义和说明如下:
1.hWnd:
对象的句柄。希望将消息传送给哪个对象,就把该对象的句柄作为实参传送,在 VB 中可以简单地
用“对象.hWnd”获得某个对象的句柄,如 Text1.hWnd和 Form1.hWnd分别可以得到 Text1和Form1的句
柄。它是一个长整型数。Windows给每个控件一个编号,这个编号就称为窗口句柄。有了这个句柄,我们
就可告诉 Windows 我们要控制哪个控件,所以这个句柄在 API 调用中至关重要。VB 的大多数控件都包
括hwnd属性,如下拉框、TreeView等,窗体也有这个属性。但也有一些控件没有这个属性,如标签控件。
没有这个属性就无法利用Windows API函数,但可以节省系统资源。
2.wMsg:
被发送的消息。根据具体需求和不同的对象,将不同的消息作为实参传送,以产生预期的动作。使
SendMessage 传递消息,大多是为了完成以下几个工作:
①设置控件的一些选项,象我们要使用的CB_SETDROPPEDWIDTH的就属于这种情况。尽管VB的每个控
件都提供了许多属性,但仍然有许多控件的选项没有包括在其中。而这些选项中的大多数都可以利用该
函数进行设置?
②获得控件的一些设置。同上一种情况相反,有时我们需要获得控件的一些设置,相当于读取属性。
例如,如果想知道一个下拉框的下拉部分的宽度是多少,就可以向控件发送CB_GETDROPPEDWIDTH消息。
对于这种情况,SendMessage函数的返回值就是结果。
③执行一定的操作。例如,我们要在下拉框中寻找是否有“ABC”这个字符串,当然,我们可以编写
一个循环,逐条比较看是否存在这样的字符串。如果使用API,我们只需要向下拉框发送CB_FINDSTRING
消息,这条消息就会自动进行查找工作并返回结果。
④模拟用户操作。我们有时希望模拟用户的操作,比如关闭其他应用程序的窗口。其实只要我们能知
道那个窗口的句柄,我们就可以发送WM_CLOSE消息给那个窗口,窗口接受到这条消息就会关闭,如同用户
关闭窗口一样?
3.wParam、4.lParam:
附加的消息信息。这两个是可选的参数,用来提供关于wMsg消息更多的信息,不同的wMsg可能使用这
两个参数中的0、1或2个,如果不需要哪个附加参数,则将实参赋为NULL(在VB中赋为0)。
lParam定义为Any类型。指定 Any类型可禁止VB进行类型检查,从而允许将任意数据类型传递给该过
程。由于每条消息对参数的类型和传递方式的要求都不同:有的可能要求为Long型,有的可能要求为自定
义类型;大多数要求按传值方式传递,但也有一些要求按传地址方式。为了满足各种要求,我们将这个参
数定义为Any类型。比如,我们要传递一个Long型变量lData。如果消息要求传地址方式传递,可以使用:
SendMessage ……, lData
而如果要求传值方式传递,则使用
SendMessage ……, ByVal lData
如果传递常数,我们则需要使用类型后缀来指定常数的类型,比如"0&",表示Long型的常数0,如
SendMessage ……, ByVal 0&
我们也可以使用类型转换函数CLng将常数指定为Long型,如CLng(0)。
程序中,有时定义 lParam As Any,有时定义 ByVal lParam As String。这是为什么呢?对于
SendMessage函数,lParam的使用是很灵活的,在一般情况下,lParam是一个指针,它指向的数据类型
有三种:长整形、自定义数据结构类型、字符串类型。对于前两种类型,需要将 lParam定义为 lParam
As Any,从而将 lParam 数据的指针传递到 SendMessage 函数。对于字符串类型,则需要定义 Byval
lParam As String,因为字符串类型数据不同,只有定义 ByVal,得到的才是字符串的指针,如果没有
ByVal,得到的将是指向字符串指针的指针。另外对于少数的消息来说,SendMessage 函数需要的只是
lParam 本身的值,这时就需要将 lParam定义为 Byval lParam As Long,或者在程序调用时在 lParam
之前加 ByVal?
当用户在编辑控件上进行各种操作时,其父窗口将收到 WM_COMMAND 通知消息,lParam带控件句柄
(hWnd),同时 wParam 的低16位带控件的 ID,高16位带有如下表的消息代码.
常用编辑控件消息:
- EC_LEFTMARGIN(&H1) EC_USEFONTINF //设置左边距时使用
 - EC_RIGHTMARGIN EC_USEFONTINF //设置右边距时使用
 - EC_USEFONTINF,O//边距 设置编辑控件的左、右边距,当wParam含EC_LEFTMARGIN时在lParam的低16位指定左边距点数,当wParam含EC_RIGHTMARGIN时在lParam的高16位指定右边距点数。当指定wParam为EC_USEFONTINFO时,则用当前字体的字符"A"的宽度指定右边距和字符"C"的宽度指定左边距lParam被忽略。
 - EM_CHARFROMPOS(&HD7=215),0, //取得编辑控件中指定位置的字符相对于文本头部的偏移量。使用本操作应先在第4个参数的高16位指定行号,低16位指定列号(或一个POINTAPI结构),行列是按编辑控件的客户区左上角为原点(0,0)计算的。如果指定的位置超出控件客户区则返回-1
 - EM_CANUNDO(&HC6=198),0,0 //决定前一次编辑操作是否能够撤消:检测控件撤消缓冲区是否为空,通常控件把最后一次在控件的编辑操作保存在一个撤消缓冲区,如果缓冲区非空则返回TRUE表示上次操作可以撤消,否则返回FALSE,应用程序可以利用该返回值来禁止或允许菜单或工具条的"撤消"项。
 - EM_EMPTYUNDOBUFFER(&HCD=205 ),0,0 //清除控件的撤消缓冲区,使其不能撤消前一次编辑操作
 - EM_FMTLINES(&HC8=200) //决定是否在取回的文本宇串中包含软回车字符
 - EM_GETFIRSTVISIBLEINE(&HCE=206),0,0 //获得文本控件中处于可见位置的最顶部的文本所在的行号
 - EM_GETLINE(&HC4=196 )//行号,ByVal 变量 获取编辑控件某一行的内容,变量须预先赋空格
 - EM_GETLINECOUNT(&HBA=186,0,0// 获取编辑控件的总行数
 - EM_GETMODIFY(&HB8=184),0,0 //判断编辑控件的内容是否已发生变化,返回TRUE则控件文本已被修改,返回FALSE则未变。
 - EM_GETPASSWORDCHAR( ),0,0 //获取编辑控件的密码字符,返回NULL表示没有字符
 - EM_GETRECT(&HB2=178),0,结构 //获取编辑控件的格式化矩形
 - EM_GETTHUMB(&HBE=190),0,0 //取得多行文本编辑控件的滚动框的当前位置(注意:是象素值)
 - EM_GETSEL(&HB0=176),0,//变量 获取光标位置(以字节数表示),或:(缓冲区起点,缓冲区终点)取得编辑控件中选定内容的范围,返回值中低16位为起点,高16位为终点
 - EM_GETHANDLE(&HBD=189),0,0// 取得文本缓冲区
 - EM_GETWORDBREAKPROC(&HD1=209),0,0 //取得整字换行回调函数EditWordBreakProc指针
 - EM_GETLIMITTEXT(WM_USER+37=1061),0,0 //获取一个编辑控件中文本的最大长度
 - EM_GETMARGINS( ),0,0 //获取编辑控件的左、右边距,返回值低16位为左边距,高16位为右边距(不得用于NT3.51)
 - EM_LIMITTEXT(&HC5=197),//最大值,0 设置编辑控件中的文本长度
 - EM_SCROLLCARET(&HB7=183),0,0 //把可见范围移至光标处
 - EM_LINEFROMCHAR(&HC9=201),//偏移值,0 获取指定位置(或:-1,0 表示光标位置)所在的行号
 - EM_LINEINDEX(&HBB=187),//行号,0 获取指定行(或:-1,0 表示光标所在行)首字符在文本中的位置(以字节数表示)
 - EM_LINELENGTH(&hC1=193)//偏移值,0 获取指定位置所在行(或:-1,0 表示光标所在行)的文本长度(以字节数表示)
 - EM_POSFROMCHARPOINT,结构地址,偏移值 取得指定字符位置的行列号,偏移值是字符相对于文本头部的偏移。
 - EM_LINESCROLL(&HB6=182)//列数,行数 指定行数的文本水平滚动,每次滚动N列
 - EM_EXGETSEL (&H434 = 1076)
 - EM_EXSETSEL(&H437=1079),0//结构 RichEdit控件设置文本选定范围,参阅 EM_SETSEL 消息,结构是指 CHARRANGE 结构
 - EM_PASTESPECIAL(&H440=1088),2(1),1// RichEdit控件粘贴剪贴板中的位图(或文本)
 - EM_FINDTEXT(&H738=1080) //RichEdit控件正文搜索操作
 - EM_FINDTEXTEX(&H44F=1103) //同上
 - EM_SETTEXTEX(&H461=1121) //RichEdit控件正文替换/插入操作
 - EM_SETTARGETDEVICE, GetDC(RichText.hWnd), RichText.Width // 15)设置 RichTextBox 自动换行,后续代码是:RichText.RightMargin = iif(RichText.RightMargin = 0,1,0)
 - EM_SETTARGETDEVICE, 0, 1 //设置 RichTextBox 不自动换行
 - EM_POSFROMCHAR(&HD6或&H426)// 判断指定字符在编辑控件的位置(用于NT3.51)
 - EM_SCROLL(&HB5=181),*,0 //文本垂直滚动。第三个参数*控制滚动方向:SB_LINEDOWN(1)向下滚动一行,SB_LINEUP(0)向上滚动一行,SB_PAGEDOWN(3)向下滚动一页,SB_PAGEUP(2)向上滚动一页。
 - EM_REPLACESEL(&HC2=194),1(0)//,字符串 用指定字符串替换编辑控件中的当前选定内容,如果第三个参数wParam为1,则本次操作允许撤消,0禁止撤消。字符串可用传值方式,也可用传址方式(例:SendMessage Text1.hwnd, EM_REPLACESEL, 0, Text2.Text '这是传值方式)
 - EM_SETSEL(&HB1=177)//,起点,终点 设置编辑控件中文本选定内容范围(或设置光标位置),该范围被反相显示,用于为复制、替换、粘贴、剪切、删除等编辑功能指定范围,光标将被移至指定的终点后面。还可使用指定相同起点和终点来移动光标而不是选定范围。当指定的起点等于0和终点等于-1时,文本全部被选中,此法常用在清空编辑控件。当指定的起点等于-2和终点等于-1时,全文均不选,光标移至文本未端,此法常用在文本未端追加内容。注意:当控件没有输入焦点时,本操作将会失败,一般在执行本操作前都应调用SetFocus先取得输入焦点。
 - EM_UNDO(&HC7=199),0,0 //撤消前一次编辑操作,当重复发送本消息,控件将在撤消和恢复中来回切换
 - EM_SETCHARFORMAT(&H444)// 改变选定文本的颜色
 - EM_SETHANDLE(&HBC=188),//缓冲区指针,0 为编辑控件指定新的文本缓冲区。此操作仅适用对话框创建带DS_LOCALEDIT风格的控件。
 - EM_SETLIMITTEXT,长度(字节),0 //设置编辑控件中的文本最大长度(不得用于NT3.51)
 - EM_SETMARGINS(&HD3=211) //设置编辑控件的左、右边距(不得用于NT3.51)
 - EM_SETMODIFY(&HB9=185),1(0),0 //设置或清除一个编辑控件的修改标志
 - EM_SETPASSWORDCHAR(&HCC=204),//字符,0 指定控件用来显示密码的字符,缺省为"*"。当第三个参数wParam为0时,本操作将清除控件的ES_PASSWORD风格,并按实际字符显示。
 - EM_SETREADONLY(&HCF=207),1(0),0 //决定是否将编辑控件设为只读,同时决定控件的ES_READONLY风格
 - EM_SETRECT(&HB3=179),0(或RECT),//结构地址 为一个编辑控件设置格式化矩形
 - EM_SETRECTNP(&HB4=180),0(或RECT)//,结构地址 为一个编辑控件设置格式化矩形,只是控件此时不会重画
 - EN_CHANGE(&H300=768)// 编辑控件的内容发生改变。与EN_UPDATE不同,该消息是在编辑框显示的正文被刷新后才发出的。
 - EN_ERRSPACE(&H500=1280) //任何时候只要由于内存不足以完成一项编辑操作
 - EN_HSCROLL(&H601=1537)// 用户单击了编辑控件的水平滚动条。注意:这条消息是在控件更新显示之前发送出去的。
 - EN_VSCROLL(&H602=1538) //用户单击了编辑控件的垂直滚动条。注意:这条消息是在控件更新显示之前发送出去的。
 - EN_KILLFOCUS(&H200=512) //编辑控件失去了输入焦点
 - EN_SETFOCUS(&H100=256) //编辑控件获得了输入焦点
 - EN_UPDATE(&H400=1024) //控件准备显示改变了的正文时发送该消息。它与EN_CHANGE通知消息相似,只是它发生于更新文本显示出来之前。
 - EN_MAXTEXT(&H501=1281)// 用户输人的文字数超出由EM_LIMITTEXT消息规定的界限,或超出由VB Maxlength属性规定的界限,就会发送这条消息 。此外,倘若不允许自动进行水平滚动,同时插入点要超出控件的宽度;或者不允许自动垂直滚动,同时插入点要超出控件的高度,那么也会触发这条消息。在没有ES_AUTOHSCROLL或ES_AUTOVSCROLL的编辑框中,当正文超出了编辑框的边框时也会发出该消息。
 - 编辑风格消息:
 - ES_MULTILINE //指定编辑控件能否进行多行文本编辑,若多行编辑器不指定ES_AUTOHSCROLL风格,则会自动换行,用户每按一次Enter,在当前光标处输入一个回车换行符(0Dh,0Ah),文本增加一行。若不指定ES_AUTOVSCROLL,则多行编辑器会在窗口中正文装满时发出警告声响。
 - ES_LEFT //文本显示居左?
 - ES_CENTER// 文本显示居中?
 - ES_RIGHT //文本显示居右?
 - ES_LOWERCASE //把用户输入的字母统统转换成小写字母?
 - ES_UPPERCASE// 把用户输入的字母统统转换成大写字母?
 - ES_OEMCONVERT // 把输入的文本从ANSI码转换成OEM码,然后又转换成ANSI码,目的是保证函数AnsiToOem的正确调用。这在编辑框中包含文件名时是很有用的。
 - ES_AUTOHSCROLL(自动增加水平滚动条?) 当用户在行尾键入一个字符时,正文将自动向右滚动10个字符,当用户按回车键时,正文总是滚向左边。
 - ES_AUTOVSCROLL // 当用户在最后一个可见行按回车键时,正文向上滚动一页。
 - ES_NUMBER //只接收数码输入,其它字符输入一律无效。
 - ES_NOHIDESEL(&H100=256) //当编辑框失去输入焦点时,选中的文本将隐藏,正文中的选择保持不变。缺省时正文中的选择将失效,当获得输入焦点后才又显示出来。
 - ES_READONLY 将编辑框设置成只读的?
 - ES_PASSWORD(&H20=32) //使所有键入的字符都用"*"来显示。
 - ES_WANTRETURN //使多行编辑器接收回车键输入并换行。如果不指定该风格,按回车键会选择缺省的命令按钮,这往往会导致对话框的关闭。
 - 列表框操作:
 - LB_FINDSTRING(&H18F=399),-1,ByVal //字串 查找列表项的字符串,返回值=字符串所在的列表项的索引。-1表示从第0行开始查找,如果改为一个有效的列表项索引值,将从该行开始查找。
 - LB_ITEMFROMPOINT(&H1A9=425) //获取光标所在的列表项的索引
 - LB_SETHORIZONTALEXTENT(&H194=404),//长度,0 设置列表框的横向滚动条以及滚动长度,长度为象素值
 - 组合框操作:
 - CB_SHOWDROPDOWN(&H14F),1(0),0// 打开(关闭)组合框的列表
 - TVM_SETBKCOLOR(&H1100+29=4381)// 设置扩展树型列表控件的背景色(TVM开头的常数)
 - 常用窗口消息:
 - WM_GETFONT(&H31=49)// 得到当前控件绘制文本的字体(的句柄)
 - WM_GETTEXT(&HD=13),//变量长度,变量 取得窗体的标题,变量须预先赋空字串(chr(0)),变量长度=Len(变量)
 - WM_SETTEXT(&HC=12),0,ByVal //"字串" 设置窗体的标题
 - WM_NCLBUTTONDOWN(&HA1=161),2,0 //在非客户区,即边框及标题栏上(假如定义的是一个组件,则非客户区包括Form等)按下鼠标左键;
 - WM_LBUTTONDOWN(&H201=513),2,0 //在客户区,也就是除边框及标题栏以外按下鼠标左键
 - WM_VSCROLL(&H115=277),&H10000*p+SB_THUMBPOSITION(&H4),0 //同步滚动文本,p是位置改变量
 - WM_PAINT
 - WM_USER (&H400 = 1024)
 - WM_CUT(&H300=768),0,0// 剪切
 - WM_COPY(&H301=769)),0,0// 复制
 - WM_PASTE(&H302=770)),0,0/// 粘贴
 - WM_CLEAR(&H303=771)),0,0 //删除
 - WM_UNDO(&H304=772)),0,0 /撤消
 - 按纽消息:
 - BM_SETSTYLE(&HF4)// 设置按纽样式
 - BS_RADIOBUTTON(&H4) //收音机旋纽式的按纽,是 BM_SETSTYLE 使用的参数
 
例如对windows发消息让文本选中。
- SendMessage(Text1.hwnd,EM_GETSEL,0,-1 );
 
文本全全选。
http://blog.csdn.net/sushengmiyan/article/details/7836500
windows的消息传递--消息盒子(超详细EM_UNDO等消息)的更多相关文章
- windows的消息传递--消息盒子
		
例如对windows发消息让文本选中. SendMessage(Text1.hwnd,EM_GETSEL,0,-1 ); EC_LEFTMARGIN(&H1) EC_USEFONTIN ...
 - QT学习 之 对话框 (四) 字体对话框、消息对话框、文件对话框、进程对话框(超详细中文注释)
		
QMessageBox类: 含有Question消息框.Information消息框.Warning消息框和Critical消息框等 通常有两种方式可以来创建标准消息对话框: 一种是采用“基于属性”的 ...
 - 【C#】C#中使用GDAL3(二):Windows下读写Shape文件及超详细解决中文乱码问题
		
转载请注明原文地址:https://www.cnblogs.com/litou/p/15035790.html 本文为<C#中使用GDAL3>的第二篇,总目录地址:https://www. ...
 - 一个基于TCP/IP的小项目,实现广播消息的功能。(超详细版)
		
1.结合现状 功能分析 该功能基于上个项目的改进,主要是通过对服务器端代码的修改,以及对客户端作少许修改,实现开启多客户端时,一个客户端发送消息,达到对所有客户端广播的效果.可参考网吧里的点歌系统,比 ...
 - WinMain初始化详细过程以及消息循环
		
主要内容:详细介绍WinMain函数的初始化过程以及消息循环 1.窗口类定义 通过给窗口类数据结构WNDCLASS赋值完成, 该数据结构中包含窗口类的各种属性 <1>LoadIcon 作用 ...
 - 超详细“零”基础kafka入门篇
		
1.认识kafka 1.1 kafka简介 Kafka 是一个分布式流媒体平台 kafka官网:http://kafka.apache.org/ (1)流媒体平台有三个关键功能: 发布和订阅记录流,类 ...
 - c++ 网络编程(九)LINUX/windows-IOCP模型 多线程超详细教程及多线程实现服务端
		
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9661012.html 先讲Linux下(windows下在后面可以直接跳到后面看): 一.线程 ...
 - 超强、超详细Redis数据库入门教程
		
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...
 - Github上传代码菜鸟超详细教程【转】
		
最近需要将课设代码上传到Github上,之前只是用来fork别人的代码. 这篇文章写得是windows下的使用方法. 第一步:创建Github新账户 第二步:新建仓库 第三部:填写名称,简介(可选), ...
 
随机推荐
- Objective-C 链式编程思想
			
链式编程思想 链式编程是什么 链式编程就是将调用多个方法用点语法连接起来,让代码更加简洁和可读性更高刚开始接触链式编程是Masonry,用起来真的非常爽 1 make.left.right.top.e ...
 - USB接口定义
			
一般的排列方式是:红白绿黑从左到右 定义: 红色-USB电源 标有-VCC.Power.5V.5VSB字样 绿色-USB数据线(正)-DATA+.USBD+.PD+.USBDT+ 白色-USB数据线( ...
 - IM-即时通讯技术概述
			
IM-即时通讯技术概述 简述 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容.大多数常用的即时通讯发 ...
 - JDBC批量运行executeBatch
			
JDBC运行SQL语句,有两个处理的接口,一个PreparedStatement,Statement,一般操作JDBC比較用得多的还是PreparedStatement 只是在运行批量,Prepare ...
 - ARP地址解析协议
			
ARP地址解析协议:为IP地址到相应的硬件地址之间提供动态映射. 下面图为例说明地址解析协议的详细工作流程. 结合图中的序号进行说明. client通过FTP协议连接server时,首先解析器会把主机 ...
 - hdu4597 Play Game(DFS)
			
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=4597 题意 Alic ...
 - 使用SourceTree Push 出现 POST git-receive-pack (chunked)  的解决方法
			
在使用SourceTree上传资料的时候,遇到 POST git-receive-pack (chunked) 从 stackoverflow 看到这样一则 This is a bug in Git; ...
 - PHP缓存主要技术
			
1.普遍缓存技术: 数据缓存:这里所说的数据缓存是指数据库查询PHP缓存机制,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中 ...
 - CentOS6.5下VNC Server远程桌面配置详解
			
参考文献: (总结)CentOS Linux下VNC Server远程桌面配置详解 远程桌面连接工具VNC——license Key 我的下载地址为 太平洋下载 VNC连接黑屏的问题 centos 6 ...
 - 我的Python成长之路---第四天---Python基础(16)---2016年1月23日(寒风刺骨)
			
四.正则表达式 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和 ...