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

功能强大的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环境下运行正常。

市场竞争白热化:三大云服务商上演双十二“三国杀” UCloud联手盛科实现SDN硬件应用 AWS,还有多远? Instagram推新私信功能Direct:支持照片、视频和文本信息 微软CEO鲍尔默最后一次受访:我的正确决定远远大于过错 中国创新碰撞硅谷思潮, 2013云世界大会定义云时代 Mozilla与设备商、运营商成立开放Web设备联盟 研发周报:暴露程序员身份的8个行为 专访“月熊志”公益网站技术负责人:利用技术的力量保护动物 【Hadoop技术博客推荐】站在风口的Hadoop技术研究者 2014趋势预测,大数据将成主流 国人当自强:两岸三地在线编程学习网站大搜罗 一周消息树:微软畏惧Chromebook、苹果失去优秀工程师 Google Dart语言开启标准化历程,取代JavaScript仍艰难 11款网站死链检测工具 谷歌Chromecast 2014:开放SDK、建生态系统 大举进攻客厅 优秀程序员的6个共同特质 开源的力量:“中国杯”游戏极限开发大赛 GNOME.Asia 2014年峰会时隔六年重返北京 JavaScript社区开发者调查:服务端JS盛行,Backbone.js使用最多 为什么开发者担心将代码公布 【投稿】移动互联网初创团队7大云计算服务实践分享 云计算发展越快,中小IDC发展机遇越好 前富士康CEO程天纵:创客与资本间并无矛盾 【开源专访】Java高效开发框架Nutz:是SSH的轮子?还是新神器? 仿Google Now和Siri?微软WP8.1将推语音助手Cortana NodeJS无所不能:细数10个令人惊讶的NodeJS开源项目 【快讯】18-19日,亚马逊AWS负责人Andy Jassy会在北京说什么,做什么? 数据库未来的5大预测 华为王丰谈华为一体机三大优势 FusionCube SQL Server针对Windows集群加速 浏览器基准测试:IE11成绩惊人 请教我的一个程序的窗口最大化没有把显示屏幕铺满,请问怎么处理? global.asa里面的问题 有谁知道winxp将浏览网页时的临时文件放在哪一个目录下了???? 请教sql server2000的问题,thanks!thanks! qq探密!!! 统计一下:有多少位程序员在用VB系的开发工具 关于ACCESS的两个问题,热心大虾请进! 数据恢复问题,答对即给分(在线) 做过进销存系统的高手们,请谈谈经验 asp 与 dreamweaver有联系吗? 请教如何设置WIN2000的时间服务? 怎么样判别时间字段为空 ? 如何实现类适于IE浏览器的图片旋转功能 如何在FileListBox中弹出系统对该文件的右键菜单 如何更改MFC程序生成文件的默认图标? 我是ASP初学者,请大家帮忙? 英语真的那么重要吗? 一个JS的简单问题,但是我还是给100分 怎么透明显示一张bmp图片(急,在线等待) 急,两个问题,帮帮忙(其中一个关于ActiveSkin) 查询出的报表内字段值为空的单元格,显示不出单元格框线,为什么? Java论坛 急!在LINUX下,配置内核时Intel corporation|82801AB AC'的声卡应该先哪项,我用的是2.4.16的内核。 世界杯——蓝色的忧郁 使用异步socket通信,服务器端在OnReceive消息函数中能否获得客户端IP地址? 菜鸟学JAVA送分 怎样用delphi实现EDI? 两到汇编题。麻烦大家帮我做一下。。我实在做不出来 今天去面世了~~~结果他们………… 举报 哪里有.net源程序下载?? : 两到汇编题。麻烦大家帮我做一下。。我实在做不出来 莱鸟问题:如何字符变量str的值赋给EDIT控件, : 两到汇编题。麻烦大家帮我做一下。。我实在做不出来 哪里有2001年的中程的试卷? 第一次来CSDN,以后希望大家多多帮助!! 在VB中获取和修改计算机名字 用什么软件能把扫描仪扫的文章变位文本文档?? 终止线程出错! VB中远程数据库的访问 如何实现使textbox中只能输入带两位小数的内容?即保证其中内容为*.XX(*代表任意数字串),凡不合要求的输入都被过滤? 如何在IIS的DefaultWEB Site的属性的HTTP Header中加入新的File type?? 怎样读jpeg的头文件,用C语言,谢了 为什么我远程连接sql server总不成功呢?我已经把1433端口开了啊 西游记 如何判断一个大整数是素数,如何找出整数的模逆 多层数据库开发源码大公开---不可多得! WinZip等的右键菜单Add to xxx.zip是怎么实现的? 帮帮忙,急! 因写程序丢过头发的请进. 这就是非洲英文怎么写英文歌 世界杯 那女的唱的 This is the third time this week she's been late,反义疑问句后面是isn't it 还是isn't she? 陶渊明所描写的桃花源在哪里 SHE HAS TO WASH CLOTHES EVERY WEEK(改为一般疑问句) she has not been around this week ---------which would you like ,tea or coffee ----------( )is ok.i really don't mindboth,none,either,neither 为什么选ceither不是只用于否定句中吗 They need a lot of things this week. She sends at least two emails in a week.对 at least two提问. Which would you like ,tea or coffee?( Either ) is OK.I really don't mind.括号内能填Both吗? We need a lot of things>(否定句)We_ _ _things 《再游桃花源》与《桃花源记》的问题《再游桃花源》明日过桃源县,之绿萝山下诸峰累累,极为嗖削.至白马雪涛处,上有怪石,登舟皆踞坐.泊水溪,与诸人步入桃花源.桃可千余树,夹道如锦幄,花 Which would you like,tea or coffee?_is ok.I really don't mind.A.bothB.eitherC.noneD.neither此题...Which would you like,tea or coffee?_is ok.I really don't mind.A.bothB.eitherC.noneD.neither此题应选择A.B.C.D那个选项 桃花源的翻译 I do a lot of things last week,哪里错了 桃花源记中桃花源特点与当时的社会相比,桃花源记中的桃花源有哪些特点?结合原文分点概括. 英语翻译开头是:三十六洞别有天,渊明记. 40克糖放入400克水中溶解后,浓度为( ).有选择:A 10% B1/11 C 11% D约9.09% 桃花源记中作者笔下的桃花源具有怎样的特点 桃花源记得翻译 小明去爬山,上山时每小时行3千米,原路返回时每小时行5千米.求小明往返的平均速度. 《桃花源记》桃花源的特点 要给一边长为a米的正方形桌子铺上正方形的桌布,桌布的四周均超出桌面0.1米,问需要多大面积的桌布? She did housework three times a week last year three划线,用一般疑问句,_he_times did she do上面写不下了,后面是housework,还有一句是Dogs can guard our homes 后3个单词划线,也是一般疑问句,_can dogs 网络用语鸭梨,不懂,为什么扯到语气上去了 观察与实验:把家里的梨子放入冰箱冷冻两天.1.拿出后观察到...与之有关的物理知识是...2.放在空气中两分钟观察到...与之有关的物理知识是...3.把这个冻梨放入水中(梨子浸没在水中),15分 请结合语境,选择恰当的词语填在下面横线上请结合语境,选择恰当的词语填在下面横线上(填序号)吃水的时候,感激挖井的人,——,我们更加珍惜甜美的泉水;收获的时候,感激播种的人,—— 我想知道在网络上面的那些词语是什么意思!神马 沙发 板凳 酱油 鸭梨 给力 …… 这些这些词语是什么意思还有很多网络词语,我不懂! 放在冰箱冷藏室两天的螃蟹能吃吗?我在微波炉里转过了,只吃蟹脚没事吧?我说有可能有毒可我爷爷不听啊, 如何检验鸡蛋能否孵出小鸡大型养殖场怎么样检验鸡蛋能否孵出小鸡? 依次填入下列各句横线处的词语,最恰当的一组是( )依次填入下列各句横线处的词语,最恰当的一组是( )\x05①要解决我国法律服务市场监管______的问题,就必须完善相关立法,改革法律服务 哪些事物适合放在冰箱冷藏室?哪些又适合放在冷冻室? 怎么识别鸡蛋能不能孵出小鸡 为了获得更高的产量,人们施用更多的化肥和农药,这样做的危害是什么? 将几个放在冰箱冷冻室内冻透了的梨取出后放在一大盆0摄氏度的冷水中,问有什么现象?请说得准确一点,这是一道物理题。还有就是梨与水之间内能的转移 袁中道的美在哪里 妈妈买来30个苹果,让小明把苹果放入篮子中.不许一次拿完,也不许一个一个拿,要每次拿的个数相同,拿到后好一个不剩.小明共有几种拿法? 翻译 桃源盖此比也欤 请结合文中内容谈谈袁中道的《再游桃花源》美在哪里? 皮厚表示没鸭梨什么意思 “害虫是人类的天敌”这句话对不对 登舟皆踞坐 的意思 桃可千余书,夹道如锦幄 的意思 结合文中的内容谈谈袁中道的《再游桃花源》美在哪里 《 “秒杀白熊无鸭梨”是什么意思啊?我玩的是转笔 如图 ,长方形桌面长4m 宽2m,一块长方形台布的面积是桌面面积的3倍.问长和宽各是多少? 6、依次填入下列各句横线处的词语,恰当的一组是( )(1)他平时省吃俭用,把全部__都捐给了灾区和希望工程.(2)你这番话的真实用意是什么?我得好好__一下.(3)前年我国发生了百 聚无鸭梨日是什么活动 写两句关于友谊的诗句 为了使冰糖在水中溶解的快一些,我们可以采用哪些方法快 一朵蒲公英阅读题我被老师挑选扮演一部剧中的王子.母亲知道后十分高兴,和我一起对台词.然而尽管在家里背得滚瓜烂熟,可是一到舞台上排练,我就忘得一干二净.老师不得不撤换了我的角色. 描写友谊的诗歌 Do you like __?Yes,I like apples bananas这一题咋做?是填fruit还是填fruits?要给我讲讲啊 阅读理解《一朵蒲公英》我被老师挑选扮演一部剧中的王子.母亲知道后十分高兴,和我一起对台词.然而尽管在家里背得滚瓜烂熟,可是一到舞台上排练,我就忘得一干二净.老师不得不撤换了我 为什么天敌少,害虫多?如题.为什么呢?尽量详细一点 Yes,I like them very much.可以做Do you like apples?的答语吗 用装农药或化肥的口袋装粮食可以吗? Mrs Tomson needs lot of meat this week 改错 用所给单词适当填空 1.She _____(not go)swimming this week用所给单词适当填空1.She _____(not go)swimming this weekend.2.He usually _____(finish)his homework before nine o'clock. 一位农名在种植蔬菜时坚持不打农药,不施化肥,而且用清洁的地下水浇灌,只用自家的有机肥、人粪尿等……一位农名在种植蔬菜时坚持不打农药,不施化肥,而且用清洁的地下水浇灌,只用自家 1 This is Mary.This is ___ ___ 2 She needs to get plenty of rest.She __ __ get __ __ of rest.3 Who's calling,please?Who's __,please?4 What's wrong with her?What's __ __ with her?5 Miss Green is busy now.Miss Green __ __now. She ___this book all the week,but she ___reading it yetA.has read;didn't finish B.has been reading ;didn't finish C.has been reading;hasn't finished D.has read;hasn't finished 不使用化肥和农药有什么办法能既保证增产又消灭害虫呢?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘