说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

功能强大的SendMessage函数 -VB资料

HTML文档下载 WORD文档下载 PDF文档下载
功能强大的SendMessage函数 -VB资料
Windows API(应用程序接口)是Windows系列软件为程序开发人员提供的火力强大的“武器库”,在这个武器库中,有很多极具威力的武器,SendMessage就是其中之一,它的功能非常丰富,灵活使用这个函数,会给编程工作带来很多便利。本文以Visual Basic为例,结合几个具体的例子介绍该函数的功能。
一、SendMeaasge函数简介
顾名思义,SendMessage函数的功能是“发送消息”,即将一条消息发送到指定对象(操作系统、窗口或控件等)上,以产生特定的动作(如滚屏、修改对象外观等)。
SendMessage函数在VB中的函数说明如下:
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (Byval hwnd As Long, Byval wMsg As Long,Byval wParam As Long,lParam As Any) As Long
其中四个自变量的含义和说明如下:
hWnd:对象的句柄。希望将消息传送给哪个对象,就把该对象的句柄作为实参传送,在VB中可以简单地用“对象.hWnd”获得某个对象的句柄,如Text1.hWnd和Form1.hWnd分别可以得到Text1和Form1的句柄。
wMsg:被发送的消息。根据具体需求和不同的对象,将不同的消息作为实参传送,以产生预期的动作。
wParam、lParam:附加的消息信息。这两个是可选的参数,用来提供关于wMsg消息更多的信息,不同的wMsg可能使用这两个参数中的0、1或2个,如果不需要哪个附加参数,则将实参赋为NULL(在VB中赋为0)。
在简单了解了SendMessage函数的格式和功能后,让我们以几个例子来看看它的威力。
二、SendMessage函数使用实例
例1 多行TextBox中的快速处理功能在处理多行TextBox时我们经常会碰到以下几种情况:
希望了解多行TextBox中目前共有多少行文字。
想快速返回第N行的文字。
对于上面的情况,如果用VB自身的语句或函数来实现的话,要写不短的代码,而且由于要采用顺序查找的办法来完成,因此代码的执行效率也很低。如果使用SendMessage函数则可以大大减少代码量,并大幅度的提高执行效率。
用SendMessage函数完成上面两个任务的方法非常简单,每个任务只需简单地发送一条消息给多行TextBox即可,两个消息分别为:EM_GETLINECOUNT、EM_GETLINE,其它参数和返回值见附表。
下面用一个简单的实例演示这两个功能:
新建工程,在Form1上添加三个TextBox(名称分别为Text1、txtLineCount、TxtString,将Text1的Multi
Line属性置为True)、三个标签和一个命令按钮。为工程添加一个模块Moudle1,在其中写如下声明(其中
SendMessage函数的声明可以从VB的“API浏览器”中复制): 消息常量名 消息值 wParam lParam 返回值
EM_GETLINECOUNT &HBA 未用 未用 行数
EM_GETLINE &HC4 要找的行号 存结果的字节串 结果字节串的字节数

Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long,lParam As Any) As Long
Public Const EM_GETLINECOUNT=&HBA
Public Const EM_GETLINE=&HC4
在Form1的代码模块中写如下代码:
Private Sub Command1_Click()
Dim str(256) As Byte
str(1)=1 '最大允许存放256个字符
'获取总行数,结果显示在文本框txtLineCount中
txtlineCount=SendMessage(Text1.hwnd,EM_GETLINECOUNT,0,0)
'获取第3行的数据放在str中,转换为字符串后显示在文本框txtString中
SendMessage Text1.hwnd,EM_GETLINE,2,str(0)
txtString= StrConv(str,vbUnicode)
End Sub
之后,按F5运行程序,在多行文本框中随便键入几行文字,然后按下[确定]按钮,出现如图画面,说明程序正确统计出了总行数和第3行的文字。
两点补充说明:在调用SendMessage获取第N行字符串时,lParam需要说明为字节数组,在调用完成后,再将字节数组转换为字符串;另外,调用前必须在lParam的前两个字节指明允许存放的最大长度,其中第一个字节为低位,第二个字节为高位,本例将高位(即str(1))置1.说明最大允许存放256个字符。
例2 程序控制拉下或收起组合框的下拉列来
一般情况下,为了拉下或收起组合框的下拉列表,需要用键盘或鼠标进行操作,而有时我们希望程序运行的某个时刻自动拉出下拉列表(比如在一些演示程序中),为了实现这个目的,我们也只有借助于SendMessage函数,方法是发一个CB_SHOWDROPDOWN(&H14F)消息给组合框。
在发CB_SHOWDROPDOWN消息时,wParam参数决定了是拉下列表(=True时)还是收起列表(=False时),lParam无用(设为0)。
为说明具体的使用方法,下面提供简单的程序片段。首先在代码模块中做如下声明:
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long,ByVal wMsg As Long,ByVal wParam As Long,lParam As Any) As Long
Const CB_SHOWDROPDOWN=&H14F
当程序中某处需要拉下组合框Combol的列表时,写如下调用语句:
SendMessage Combol.hwnd,CB_SHOWDROPDOWN,True,0
当需要收起组合框Combol的列表时,写如下语句:
SendMessage Combol.hwnd,CB_SHOWDROPDOWNN,False,0
例3 在列表框中查找匹配的项目
在Win95风格的帮助系统中一般都有一个“索引”页,索引页含有一个文本框和一个列表框,当用户在文本框中输入文字时,下拉列表会动态地显示与文本框中文字最匹配的项目,为用户提供了最大的方便。这种效果在应用程序的帮助系统中很容易实现(只要按照Win95帮助系统的正常制作过程制作就可以实现),如果想在应用程序的其它地方实现这种特性就需费一番心思了。
而使用SendMessage函数实现上述特性则非常简单,甚至只需一条语句就足够了,那就是在文本框的Change事件中给列表框发一条LB_FINDSTRING(&H18F)消息,该消息告诉列表框在列表中查找匹配的项目。
在发LB_FINDSTRING消息时,wParam参数代表从列表框的哪一个项目后面开始查找,一般情况下该参数可定为-1,表示从List1(0)即第一项开始向后循环查找,lParam则传进欲搜索的字符串(必须采用值传递)。
具体的代码和运行画面与后面的例4合并在一起演示。
例4 为ListBox添加水平滚动条
在VB中,列表框控件仅提供垂直滚动条,没有设置水平滚动条的能力,当某些项目的文本宽度较长时,超出列表框宽度部分的文本就无法显示出来,因此,很有必要为ListBox添加一个水平滚动条来方便操作。
为添加水平滚动条,只需发一条LB_SETHORIZONTALEXTENT(&H194)消息给列表框即可。发送消息时,wParam为滚动条的长度(以像素为单位,可通过计算得出准确的长度,也可随便给一个大于最大文本宽度的数字,如本例的250),lParam无用。下面是例3和例4合并在一起的代码和运行画面
Declare Function SendMessage Lib "user32" Alias "SendMessageA"(ByVal hwnd As Long,ByVal wMsg As Long,ByVal wParam As Long,lParam As Any) As Long
Public Const LB_FINDSTRING=&H18F
Public Const LB_SETHORIZONTALEXTENT=&H194
Private Sub Form_Load()
List1.AddItem "软件"
List1.AddItem "电脑游戏"
List1.AddItem "电视机"
List1.AddItem "电视台"
List1.AddItem "电脑"
List1.AddItem "电脑游戏软件"
'下一句为列表框添加水平滚动条
SendMessage List1.hwnd,LB_SETHORIZONTALEXTENT,250,0
End Sub
Private Sub Text1_Change()
'注意!当lParam传入的是字符串时,必须用ByVal传递
List1.ListIndex = SendMessage(List1.hwnd,LB_FINDSTRING,-1,ByVal Text1.Text)
End Sub
通过上面几个例子,想必您已经对SendMessage函数的强大功能有了初步的了解。事实上利用该函数我们还可以完成更多更好的任务,如控制文本框的自动滚屏、实现文字编辑过程中的Undo功能、操纵应用程序的窗体控制菜单等等,感兴趣的读者请参阅有关Windows API的资料。
本文程序均用Visual Basic 5.0企业版编写,在Pwin95环境下运行正常。

Gartner新报告:为改善风险管理,云服务合同需要更透明 没有银弹:探讨 Java 8 新增特性的优缺点 SDCC 2013议题更新 Pinterest架构实践、推荐系统、微信应用... 拥有82944个处理器的超级计算机 40分钟才能模拟一秒人脑活动 剑指IE10 最新测试版Chrome增加更多触摸屏功能 理性对待“云”——冲向“云”之前你需考虑的事 为Ruby On Rails开发者准备的5款IDE 一位开发人员的生日愿望清单 当“硅”已走到尽头,我们又该用什么去维系摩尔定律? 高端大气上档次 8位iOS顶级女程序媛 谁都可以做开发者:微软推出Windows Phone Web工具 Mozilla正式发布Firefox 23 新增混合内容拦截 网络监控功能 14条建议,使你的IT职业生涯更上一层楼 依托微信的电商产品实践——SDCC 2013讲师潘凡专访 IBM将向Google、英伟达等授权Power架构技术 人脑研究将推动下一代网络革命?从大爆炸到大收缩 H3C携手F5将“空转”数据中心变为“分布式数据中心” W3C小组发布Web存储API推荐标准 开发者必备的6款源码搜索引擎 闪亮登场:开发者制作图形图表所需的11款JS工具包 来自两位技术大牛的博弈:HBase或将制霸NoSQL? 应用改变世界 2013英特尔®创新应用大赛火热开启 看13位CEO、创始人和高管如何提高工作效率 对首次购买智能手机用户而言,苹果吸引力并不大 Amazon Appstore面向Web应用开放 开发者可添加应用内付费功能 CSC收购成功转型的大数据初创公司InfoChimps 嘀嘀打车发展报告:成全球最大出租车调度平台 又摊上事儿了,Android的MasterKey再次出现bug 比特币挖矿必备工具 硬件性能大比拼 RDBMS vs. NoSQL:反派为什么会得以存活并发展壮大 帮助优化移动网站:谷歌发布新指南和PageSpeed Insights工具 联众网络游戏是用什么语言写的? 有关使用DirectShow开发TV Capture的问题 如何声明和使用自定义对象(如:Tdadaset)的事件?? PB的数据窗口中GerRow()得到的不是具有焦点的行,如果我要想的到具有焦点的行,应该用什么东东 有关使用DirectShow开发TV Capture的问题(一定给高分) 在VB中能否将时间格式化为显示出毫秒来? 寻求驱动 如何给回答我问题的人加分? 如何在mshflexgrid中输入字符 如何改变当前打印机的纸型? 请问在WINXP下的怎设置IIS? 我在用 DataReport 控件对数据库进行输出时 为什么运行时总是弹出选择数据库的对话框? 这个数据库连接不是已经设置好了吗? 怎样取消textbox的凹凸感? 为什么在IE6 中使用Ctrl+Shift组合健得到的连接是http://www.china.co.cn 为什么总是出现Invalid BLOB handle in record buffer错误 大家晚上好,怎么让我的程序里有一小块是网页的内容呢?(全部家档!!) 关于Database和Session的问题!火急!(快乐的程序员) jsp+mysql如何在linux上配置 有知道黑龙江高程查分方法的吗????? *******我要一个这样的类:显示淡入淡出的菜单(最好还能有半透明的功能) *************** 特急,各位帮忙。怎么样在字符串中包含'(单引号)? 高分求助用paradox数据库保存JPEG图片的代码,我试过网上好多都没成功。markoni@21cn.com 吴文智、袁飞、Jinesc、Jneu、Amoon、ttyp、icevi、progame 快请进 请教一个表与表之间比较数据的问题,由于数据量大,造成事务不够,请教解决方案 execcommand的使用方法求救。高手请进,一定给分。 我的时钟怎么回事? Matlab论坛 打印机的取消按钮 dbgrid中当某个单元格失去焦点时触发什么事件? 关于Database和Session的问题!火急! yanxu1 学习unix下的c编程,该如何学?请介绍方法,资料什么的--我对unix和c都还熟悉。 打印机死机作何解?????? 我是新来的,请各位大哥、大姐们多多关照!!!(有内容) 再次发问关于sql server7的问题?? SQL SERVER中的一个触发器的问题!!! xml里有什么method可以取得子节点在父节点中的位置(序号)? please help me 怎么样才可以把系统存储过程的结果写到结果集里? 如何声明和使用自定义对象(如:Tdataset)的事件(beforecancel)?? 一个奇怪的问题? 各位兄弟,谁知道哪里有pb7的下载? 天呐 我提的问题从来没人回答 SQL Server小小问题 请问那里有DELPHI第二张光盘下载! 如何是使用describe来获取datawindow中的带区参数? 谁有早期的TeeChart5.ocx,文件大小为2,576,384,发行日期在2001-06-17号以前的,我这里有个crack软件,但是新下载的不行,所以重金寻求!!! 请问C语言中有字符串查找函数吗? 请问如何动态的改变应用程序的图标,一定给分 Query主从表编辑问题,从不丢失! 急急急!!!! 高分求禁止IE的自动谈出的广告,有个软见也行,或者告诉实现方法。请告诉下载的网址。 一满桶水用去了一半后,又加水3千克,现在桶里面的水是原来的5分之3.这桶水原来有多了千克? 一个鱼缸的长宽高分别是5dm,3dm,4dm,浴缸中的水面高20厘米,若里面放进体积为18dm3的石块并且完全浸没在水中,水面离缸口多少dm?(要算式) 甲乙两个加油站,间距为3600米,路旁有路标,原来40米一个(起点,终点各有一个),现在要改成50米一个,将有多少旧路标可以留用 有三条公路相交于A B C三点,要在这三条公路旁边造加油站,使它到公路的距离相等,满足条件的加油站可以几个? 一家酒店,地面上18层,地下1层,地面上1楼为接待处,顶楼为公共设施处,其余16层为客房,地面下1楼为停车场.(1)某会议接待员把汽车停在停车场,进入该层电梯,往上14层,又下5层,再下3层,最后上6 4.某路公共汽车,包括起点和终点共有15个车站,有一辆车除终点外,每一站上车的乘客中,恰好有一位乘客到以后的每一站下车,为了使每位乘客都有座位,问这辆公共汽车最少要有多少个座位? A B C 是三个加油站,现在要在这三点之间建一个储油库,使它到三个加油站的距离相等.图 B.A ..C我好像记得 姐说过可以有三个地点 一家饭店,地面上18层,地下1层,地面上一楼为接待处,顶楼喂公共设施处,其余16层为客房,地面下一楼为停场.(1)某会议接待员把汽车停在停车场,进入该层电梯,往上14层,又下5层,再下3层,最后上 地下停车库入口坡道多少米? 如图,三条公路两两相交于A,B,C三点,现计划建一座综合供应中心,在△ABC内部要求到三个顶点的距离相等请你找出符合条件的地点 一饭店地面上18层,地下1层,地面上1楼为接待处,顶楼为公共设施处,其余16层为客房;地面下1楼为停车场一家饭店,地面上18层,地下1层,地面上1楼为接待处,顶楼为公共设施处,其余16层为客房;地 为缓解“停车难”的问题,某单位拟建造地下停车库,建筑设计师提供了该地下停车库的设计示意图为标明限高,请你根据该图计算CE.(精确到0.1m)图 方法,不要方程,百分之一百全对一个长方体容器,占地面积3平方分米.将一个梨放入其中,并完全没入水中,水面升高了0.1dm.这个梨的体积是多少立方厘米 一家饭店,地面上18层地下1层地面上1楼为接待处顶楼为公共设施处其余10层为客房地下1楼为停车场客房七楼与停车场相差 层楼一家饭店,地面上18层地下1层地面上1楼为接待处顶楼为公共设施 转基因大米对人有危害吗 长方体容器,占地面积3立方分米,放入一个梨后水面升高了0.3分米,梨的体积是多少占地面积3平方分米 合肥市庐阳区某路段新建一家饭店,地面上18层,地下一层,地面上一楼为接待处,顶楼为公共设施处,其余16层为客房,地面下一楼为停车场.某日,电梯检修停电,一服务生在停车场停好汽车后,只能 数学题:为了缓解“停车难”的问题,某单位拟建造地下停车库,建筑设计师提供了地下停车库的设计示意%C地下停车库坡道口上方要张贴限高标志,来告知停车人车辆能否安全驶入,为标明限高, 一个长方体容器底面长5分米宽4分米放入一个西瓜后水面上升了0.3分米这个西瓜的体积是多少立方分米因为字数太多了,请自己辨认隔开.这个问题没有高.要今天8点之前, abc三条公路如图所示,现在要建一个货物车站,是他到这三条公路的距离相等,做图思路 转基因大米有什么不好 一桶水,倒出60千克,刚好倒出40%,这桶水共有多少千克.不用算式 什么是转基因大米 数学题为缓解“停车难”的问题,某单位拟建造地下停车库,设计师提供了车库入口设计示意图(下图),按规定为缓解“停车难”的问题,某单位拟建造地下停车库,设计师提供了车库入口设计示意 直线a、b、c表示三条互相交叉的公路,现要建一个加油站p,要求点p到三条公路的距离相等,有几种选择?如何选 某商场有一自动扶梯,小明以速度v沿开动(上行)的自动扶梯走上楼时,所用时间为T1,当他以相同的速度沿开动(上行)的自动扶梯走下楼时所用时间为T2,则该自动扶梯上行的速度为多少? 为了缓解“停车难”的问题,某单位拟建造地下停车库,建筑设计师提供了地下停车库的设计示意为了缓解“停车难”的问题,某单位拟建造地下停车库,建筑设计师提供了地下停车库的设计示意 转基因玉米是怎么一回事 一个长方体容器,从里面量长宽均为2分米,向容器中倒入3.5升水,再把一个石头放入水中,这时量得容器内的水深是25厘米.这个石头的体积是( ). 顾客站在商场自动扶梯的水平台阶上随自动扶梯匀速上升.顾客在上升过程中(c) A、机械能保持不变 B、运动状态在不断变化 C、相对于其站立的台阶是静止的 D、受到重力、支持力和摩擦 转基因玉米有什么特点 一个长方体玻璃容器,从里面量长4分米,宽3分米,里面装有水2.4升,再把一块石头放入水中.这时量得容器内水面高是5厘米.这块石头的体积是多少? 小明站在超市的自动扶梯上,随着自动扶梯匀速上升的过程中,小明()A.动能转化为势能,机械能减小B.只受到重力与支持力的作用C.如果选“自动扶梯”为参照物,小明是运动的D.自动扶梯对小 一个长方体容器里面的底长2分米,宽1.放入一个苹果后水面升高了0.2分米苹果的体积是多少? 一个长方体玻璃容器,从里面量长宽均为3分米,向容器中倒入7.2升水,再把一块石头放入水中(石头完全浸入水中,水为溢出)这时量得容器内水深9厘米,这块石头的体积是多少? 乘超市的自动扶梯,自动扶梯的长度是22,求小明的速度与自动扶梯的速度的数学问晓明顺着扶梯的方向走,用了一分钟,用同样速度逆着走,用11分钟,自动扶梯的长度是22米, 商品进价为400元,标价为600元,商店要求以利润率不低于5%的售价打折出售,最低可以打几折出售此商品? 为了测量一个石块的体积,在一个长10分米、宽6分米、高4分米的长方体容器中放入适当的水,再把石块放入水中这时长方体中的水面上升了15厘米,求石块的体积是多少立方分米? 7明明和玲玲每个都有一些本子,如果明明给玲玲2本,两人就一样多,如果玲玲给明明1本,明明的本子就是玲玲的7倍.问明明和玲玲各有多少本子 不能用方程解 转基因玉米长什么样 一个长方体容器里面量长四分米宽三分米相容器中到十八升水把一块石头的没入水中这时量的容器内水深28厘米石头的积是多少 "一栋大楼共20层.李叔叔乘电梯从地上10层到地下9层要20分之3李叔叔乘电梯从地下8层"到地下一层车库要多少分钟 一条高速公路全长400千米,每80千米建一座加油站,起点和终点各建一座.一共需要建多少座加油站? 这是转基因玉米吗 一个长方体的总和是60cm,它正好能被切成3个同样的正方体.原来的长方体的表面积是? 一个长方体容器长10分米宽8分米深是6分米把一个石头放入其中水面上升1.5分米还有一半露出水面求石块体积 【数学应用】小红的爸爸想在本镇的3条交叉公路处建一个加油站,要求它到三条公路的距离相等.小红的爸爸想在本镇的3条交叉公路处建一个加油站,要求它到三条公路的距离相等,这样可供选 转基因的危害 转基因大米什么样 一个长方体容器,底面长2分米,宽1.放入一个石块后水面上升尸0.2分米,这个石块的体积是多少? 有三条公路相互交叉,现在公路围成的空地上要修建一座加油站,使它到三条公路的距离相等,问加油站该修建在什么位置? 一个长60cm,横截面是正方体的长方体.如果长增加6cm,表面积就增加96cm,求原来长方体的表面积和体积. 一立平方水有2000斤一立平方2块,一桶水40斤,求一桶水价钱.写算术下来 鱼缸长4宽3深2把一个石头放入身高了0.8,石头体积多少 单位是分米哦快, 转基因大米人吃了有什么危害 算术:两个小孩抬一桶水,三个小孩抬九桶水,怎样抬合算? 一个鱼缸长1m,宽3dm,高4dm.将一条鱼放入鱼缸后,水面由3dm升至3.12dm.鱼的体积是多少? 一个长方体棱长总和60Cm,正好切成3个相同的正方体,原长方体体积是? 王老师将一满桶水用去一半后,又加水3千克,现在桶里的水是原来的5分之3,这桶水原有多少千克?3÷(3/5-1/2)这种做法是什么意思, 一个鱼缸的长 宽 高分别是5dm 3dm 4dm,鱼缸中的水面高是2分米,若从里面放进积为18立方分米的石块,水面离缸口多少分米? 每瓶饮料Xml,5瓶这样的饮料平均分给3个同学,每人可分到多少ml?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn