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

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

与Linus Torvalds“并列”,虚拟化天才程序员法布里斯贝拉 让超级计算机和数据中心“飞”,Intel推800Gbps神器MXC 【OSTC讲师专访】Debian开发者李道兵:平静地理解开源 红帽推出开源业务流程管理套件:JBoss BPM Suite 6 科学研究证明:程序员快乐才能更好的工作 ChocolateChip-UI:能“逆转”的跨平台应用开发框架 分享12款最佳的Bootstrap设计工具 Apache Flex 4.12发布,支持iOS 7 智能手机应用挑战Web平台,看W3C如何反击? 电信级数据流量与监控系统部署案例分享 TCL联手Mozilla,HTML5智能电视真的要来了! 先睹为快:Unity亚洲开发者大会虚拟游览展示 OSTC·2014 演讲日程出炉,Perl创始人来了! Unity将收购Applifier,并引入Everyplay和GameAds两大平台 《近匠》从Cubieboard到radxa:汤亮的第二次硬件创业 九头蛇与大象之争,Hydra或将取代Hadoop 喜讯:中国安全团队Keen成功在Pwn2Own 2014黑客大赛上攻破64位Mac上的Safari OCP黑客马拉松冠军:24小时头脑风暴背后 新时代应用程序设计及MongoDB的十个深入理解 借助“开源”东风 英特尔打造卓越“软实力” 深圳综合交通设计研究院张鹍鹏:智能交通设备领域已成红海 信息化是发展趋势 25个可遇不可求的jQuery插件 Web设计中对视差设计的误区 直接拿来用,九个超实用的PHP代码片段(二) 一周消息树:小米染指平板电脑凶多吉少 移动周报:Xcode 5.1更新、CarPlay揭秘,Apple很忙 可穿戴领域,创业公司的掘金点?还是滑铁卢? 搜狐SendCloud2014运维技术沙龙拉开帷幕 一周热点:选择Go语言的12个理由,九头蛇与大象之争 中国云计算大会PPT集萃(二):十位技术大牛分享平台打造技术 延迟250毫秒损失数百万美元,Hadoop系统该如何应对实时任务 有人知道如何在application中取出拨号地址的吗? 这不公平!!!!!!! Delphi 指针问题,请大家帮忙! web assistant怎么根据数据库中的数据生成一个页面?那个页面要我自己的样式? 大家帮我看看错在那里!谢谢! 请问有没有用自己的机子作服务器的? 帮我看看代码 日志钩子的安装问题? 如何使用。MDB文件 由于上一题回帖子的人数众多,导致分数不够,所以再开一帖!继续!关于用vb进行文件的读写问题! 怎样在数据库中输入了许多条记录后, 一次性存盘成功? 改变光驱盘符?很急很急 在Oracle中怎样加已经存在的数据文件? 我想请高手帮忙 !! 请问目前那一本参考书对DELPHI初学者有很大提高? 一个关于udp重发的问题 如何在delphi程序里调用vc写的exe执行文件。 如何将query中的内容输出到文本文件,然后还能将该文本文件再导入进来?急急急!!!!!!!!!!! 急急急!!我的计算机找不到硬盘了45分 如何求任意多边形的重心 紧急求助:请问java有没有比较丰富的多媒体控件?比如录音的控件??? 急急急!!!我的计算机找不到硬盘了,45分 如何把一个字段的内容求和,然后把结果存入另一表! 请教,怎样把一个记录数组用VB读入ACCESS 2000数据库中? 关于货币类型的问题? the script too large ????????我快疯了。 什么地方有Sybase与Oracle的比较资料? 急急急!!!我的计算机找不到硬盘了,40分 问一下大家 复活节彩蛋 win2000 professional下如何配置weblogic6.0 jsp和javasript如何通讯? 急!!!如何把'¥100'字串转化为浮点型100.00 用OleContainer1将一个WORD文档存进数据库后如何将它从数据库中取出??? 关于SNMP的问题(请高手回答,送40分) 谁想过要戒水?戒成了吗?又渴了吗? 我用在各种机器上使用Win2000,从来没有down过, 真是太奇怪了??? 请问如何确定操作系统系统是中文的还是英文的? 向外国用户发注册码时候应该说些什么,才能让别人觉得你比较专业? 如何捕获ADO的异常信息 struct结构的数据存储是用的什么顺序方式呀? 能介绍几本关于BCB的适合初学者阅读的书吗? 高手进来,struct结构的数据存储是用的什么方式呀 高分!高手请进!!! Newton 有关StoredProc的 各位大虾进来看看,Debug时的错误~~~~~~~ First-chance exception 和 User breakpoint ,帮帮我啊!!! 虽然我也回复没有分,但有意思的帖子,但我对分数高的帖子更有热情,我是不是很势利?? 我的服务器是unix 哪位提供最简单的图片存入库中的代码 谁能得到拨号上网所使用的电话的号码? 英语有哪些标点符号 英语翻译我想写一封信给Daniel,不过我的英语不行,请帮我翻译一些句子,请不要发在线翻译的结果给我,1 哈利波特系列是我最喜欢的书之一.读书的时候我的思绪在奇妙的魔法世界游走,但在看 联想笔记本键盘字母变数字? 英文里为什么很少用标点符号?印象中括号,引号,破折号都很少见,书名号更是根本没有,常用的只有逗号句号和问号,偶尔能看到个引号.这是为啥捏?3Q 英语翻译新年期间收到叔叔的一封邮件,内容是:叔叔们准备寄700美元回家乡给我们过新年,但是到目前为止,我们并没有收到关于这700美元的任何信息!在发这封邮件之前,我已经发过两封邮件 下面的字母各代表什么数字?(不同字母代表不同数字.)a 0 b c 3 - x 7 2 y =7 7 7a=?b=?c=?x=?y=? 英语翻译英文句子里电影名字是用《》书名号括上,还是用“”引号括上? 英语翻译Hello,My name is Loyce Agurma,I came acrose your profile hi.baidu.com I felt it and decide to send you a massage,to ask you for friendship .you know having a prophesy of love over someone there most be odds around the,but no matter the od 下面算是中相同的字母代表相同的数字,不同的字母代表不同的数字.每个字母各表示什么数字? 填写标点符号, 如何写英文祝贺信 手机ID号是按哪些数字和字母啊? 标点符号填写1雨的力量在于它可使一望无际的黄土高原转眼变得沟沟壑壑()混乱不堪()而知识的力量则在于它可改变命运()扭转乾坤(),缔造美好的未来.2不要在光线暗的地方看书( 这封信怎么写?英语Contact person是 Julie Murphy,公寓名字是Medical Center Apartments.它有三种,1 bedroom,2 bedroom和3 bedroom,我想选这个3 bedroom,住6个人最划算的这个. Photoshop选颜色画面的下面前面带#号的选项 ,有是全是数字有时全是字母有时是数字字母组合那个选项是做什么的? 填写标点符号 字母找规律1、BEH,ELM,LN( )2、CFL,FKP,KR( )3、KFP( ).DML( ) 4、ELN( ).ADG( ) 沪牌照沪+字母 字母+四位数字的号码和沪+字母 +全数字的有什么差别?现在上海的私车牌照有的是比方:沪D H1234,有的是沪D 12345 这两种牌照有什么差别? 问一个标点符号书写问题如果用格子信纸书写到每一行还有一个空格时,这时正好这句话还差一个字,如果加上句末的标点符号就需要两个空格了.通常遇见这种情况下是不是这最后一个空格就 英语字母找规律A,S,D,F,G,H,J_,_.请问该填什麽?规律是什麽? 数字30~40用英语怎么写?35~40的就可以了~ 名信片的英语怎么写 看字母 找规律ABAABAAABAAAABAAAAABAAAAAAB.按以上的规律,那么前2005有几个B 英语数字1-30 英语比赛,要写一篇英语作文,布置怎么写英语信. 我想给字母找规律根据提示写字母A D G D I N I P ( ) 用括号内所给单词的适当形式填空.1、If my bank manager ______(lend) me the money,I______(buy) a new car next month.2、I______(have)to go to see the doctor tomorrow.3、If you bring friends from other schools,the teacher ____(ask) them "英文怎么写?你...以上英文怎么写? 找规律填字母.(1)K F P () (2)E I N () A D G ()D M I ()(1)K F P ( ) (2)E I N ( ) D M I ( ) A D G ( ) 用括号中所给的动词的适当形式填空(英语)My grandfather___(go)to the park every morning.They are____(have)a lesson now.The teacher is_____(stand)in front of the blackboard.He____(paint)his desk black last week.I______(此处填 英语信怎么写 During the summer holiday there will be a new schedule.C 1 for meal and l 2 service hours and for bus schedules will appear on the wall outside the dining room.We are making weekly film and concert schedules.They will a 3 each Wednesday outside the l 谁能帮我做一下这几道英语题 (用括号内所给的适当形式填空)1 ) How many * (time) did he orbit the Earth?2)The plane landed * (safe)in shanghai.3)The boy * (bear)in 1993.4)Jack and I * (be) late for school yesterday.5)T 《信我 》的英文怎么写 潮州话数字1-10和26个英文字母怎么读?和普通话发音不同的请注明读音,0,2,5,10怎么读?用汉字表示出来好吗? 用括号中所给词的正确形式填空①Which month is the_____(nine)month?②______(sixty-two)students are in our class.③May 10th is her brother's______(thirty)birthday.④Mr Wu is on______(twelve)floor of the building.⑤Tom is_______(thre 我喜欢你 你信么英语 (英语题)根据首字母填空(10题)1.Monica h_____ three books and apencil case.2.Do you h_____ a baseball bat?3.Let's p_____ soccer.4.That's _____ interesting.5.I don't w_____ TV in the evening.6.How do you s_____ pencils?7.There are so 英语题目用括号内所给的正确形式填空that sign means “no【 】【litter】there are a lot of【 】【photo】on the deskare they【 】【make】model planes now?the old man often【 】【touch】the tree thereplease come here【 我说我喜欢你,你信不?英文怎么翻译 英语首字母填空 急! 所有空都得填出来(数清了,是10个空)"Be careful" is used very often in China to show care f______ others. But in Britain it sounds like giving an order or w_______. You could say that to younger people but n_____ 用括号中所给的单词的适当形式填空(英语)Today she____(like)basketball,but she_____(enjoy)playing volleyball in five years. 见信速回用英语怎么写 衣服码号有数字的,有英文字母的,到底多大的号对多大的码? 请用括号内所给单位的适当形式填空.一、请用括号内所给单位的适当形式填空.1.I can’t____(help)you now.2.There are brown____(desk)in the classroom.3.---Is this____(she)bike?---Yes,it is.4.I often____(do)t 他在信中写了什么吗 用英语怎么说 用户名由6-20位长度的数字,英文字母和标点符号组成,至... 英语题(用适当形式填空)1.I_____ just ______(finish) my homework.2.He ________(go)to school on foot every day.3._______you ________(find) your science book yet?4.If it _______(be) fine tomorrow,I'll go with you.5.I've lost my pen.________you 昨晚我写了一封信(求英语翻译) ORACLE SQL 获取26个大写英文字母A-Z形如:字母ABCD……Z不用union的方式 英语适当形式填空 这题怎么做?These dresses______(look)nice on ______(they) 英语信怎么写啊 caxa如何将标注中的数字尺寸换成英文字母?我选编辑-文字内容,经常改不了,还是数字而不是字母,为什么? She took the dress out of the shop without ______(pay).适当形式填空的, 怎样切换中文标点和英文标点? ( )the( )( )English?翻译:这封信是用英语写的吗? 笔记本键盘上的英文字母为什么会变成数字?有时候玩着玩着这些英文字母J I O L M U 都会变成数字 一些数字34560 就会按出来是#¥%……这样子为什么会这样?打问号还会变成+ 为什么 笔记本上 关于英文里的标点符号今天上课就是讲这个..听不太懂....不是句号实不实心的问题...是想问在句子中分段的用法.. 英语翻译MIKE JASON先生您好:在北京的机械展览会上,有幸认识您十分的高兴.我公司是经营脚轮,履带板翻新等项目.希望能与贵公司合作.下面是我公司的联系方式天津XX脚轮厂地址:天津市河东区 华硕笔记本键盘的字母变数字了,怎么回事我按键盘的u i o j k l m 是数字 4 5 6 1 2 3 0 请问下是怎么回事啊?怎么才恢复得过来呢?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn