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

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

【MDCC 2014】英雄会晚宴——厉兵秣马,再上征程 移动开发技术与平台峰会(上):流量优化、数据管理、IM、LBS与跨平台开发 【推广、盈利与投资论坛】探寻推广与盈利新趋势 【企业移动化论坛】翻山越岭,创新突围企业移动化 解读微信与开发者双赢的开放能力 2014年10月操作系统份额:Windows 8.1份额喜人,Linux跌惨了 智能硬件峰会(下):苹果、微信、小米带给移动医疗产品开发的启示 移动游戏峰会(下):从端游转型手游、如何做一款不一样的游戏 移动游戏峰会(上):小团队如何做出大制作、游戏防作弊攻防战 深圳微信开发者大会:拒绝概念 这次只谈“怎么做” AMD应邀出席HPC China 2014,重磅推出新一代Firepro-S系列高性能显卡 你就是主角,MDCC 2014交流对接活动回顾(组图) 解读最具O2O属性—哈根达斯微信企业号的成功之道 值得Java开发者参与贡献的十个开源项目 LokiJS:纯JavaScript实现的轻量级数据库 OpenStack第七次北京Meet Up:谈私有云现状 中国电信携手电商打造跨界O2O联盟 【MDCC 2014】移动开发技术与平台峰会(下):系统演进、应用数据泄露风险 惊喜太多 IntelliJ IDEA 14正式发布 欧派、南航、招行、哈根达斯等加盟 深圳微信大会第二批讲师议题公布 【MDCC】用友高级副总裁谢志华:企业移动化的变革与挑战 HTML5定稿了,为什么原生App世界将被颠覆 走苹果的路子!Jawbone推低端健身追踪设备 专访POWER 8编程挑战赛选手吴亮:集众家之长, 激发算法性能极限 微信沟通接口上线,开启移动应用与公众号的连接 【特惠最后1天】参加深圳微信开发者大会赠书及全套讲师讲义(附大会最新日程) 编码运行两不误!KZPlayground,Objective-C中的Playgrounds 专访PopCap:AR是数字与物质世界的调和剂 【多图】Github编程语言分布统计:JavaScript称霸 【最具价值CTO评选秀】途家美女CTO杨孟彤:不创业会后悔 2014腾讯WE大会:开启未来的五大科技发展趋势 在delphi中使用什么报表控件打印的报表效果较好 谁知道db或dbf头文件的格式? 急急 NMFtp中我想从ftp服务器下载指定文件扩展名的文件,该怎么办? 初始化页面的时候,如何使TextMode="Password"的asp:textbox有默认值显示? IBM软件清库存(大优惠) 又是可恶的乱码问题 struts与数据库!在线等待! 如何开发asp.net程序(基于vb) vc++的链接错误 如何用程序动态的获得activex控件的方法属性事件信息 请教:使用web.xml做资源约束时如何由自己的程序来做用户验证 请问:怎样编程来来虚拟网卡? 急!创建LOOKUP的问题 如何计算cpu和memory的一般的使用上限 新问题请教! 老问题:从Excel文件里把数据导入导数据库中 有汇编玩的非常牛的人吗??? 字符串操作的简单问题 学习J2EE需要装什么软件? >>有关记录的问题??<< 请高手指教:出现“ORA12663:服务器未提供客户机要求的服务”问题,怎么解决? 大侠救我! 动态sql问题请教,谢谢 填充combobox的问题 windowsxp不能创建拨号连接 怎樣轉換時間格式 ACCESS问题 Linux下上网问题?在线等待!急!急!急! 终极讨论:从Excel文件里面导入数据 winsock的问题 关于WINDOWS下邮件程序编写问题 Solaris下的Makefile问题 在lan里面的两台主机之间怎么配ppp连接,没有modem 我的SQL数据库安装的是实例,好象有问题哦! 高分求票据、合同套打代码! 事务问题,请大家帮忙,在线等待,50分相送!!!! xml解析的问题? 关于CRuntimeClass,请指教。 100分求解(在线等待) 终极讨论:从Excel文件里面导入数据 CString怎样转换为char * 类型? 有关爱情与事业的讨论! replace(replace(replace(replace(str,"<","&lt;"),">","&gt;"),chr(13),"<br>")," ","&nbsp;")是什么意思? 非常简单的问题!!! 看看这个portal做的怎么样? 如何去掉word中的页码 兄弟们,帮忙推荐一本powerDesigner的中文书籍,电子书籍也可以,在线等待!thanks! 动态sql问题请教,谢谢 为什么我的OnTimer不响应呀 为什么javabean能连到oracle而jsp调用这个bean却连不上。 如何将一个xml倒过来输出 doing是什么意思 久别重逢怎么造句 判断题:在我国,中央国家领导人都是由全国人民代表大会选举产生.麻烦解答下,还有一题:行政诉讼即人民法院对具体行政行为的合法性与合理性进行审查的司法活动. 已知a,b为非零向量,函数f(x)=(xa+b)(a-xb),则使f(x)的图像为关于y轴对称的抛物线的一个必要不充分条件是A.a⊥bB.a平行bC.|a|=|b|D.a=b 南美白对虾、罗氏沼虾与中国对虾生活习性的对比 弃捐勿复道,努力加餐饭 形容一个人出门便要打扮漂亮,而家中乱得如垃圾堆一般的词语 英语翻译a telecommuting work force can help business-owners substantially curtail the overhead costs,such as the costs of rent and utilities “弃捐勿复道,努力加餐饭.” A.步步惊心 B.步步惊情 C.金玉良缘 D.犀利仁师 爱因斯坦的最大失误怎么样 两阶段法求线性规划问题maxz=10x1十15x2十12x3{5x1十3x2十x3=0并指出属哪一类解 收油方向跑偏是怎么回事? 英语翻译llacer ramirez lerardo laguia numero 49 alzira 46600西班牙巴伦西亚的一个地址。请注明那个是街道什么的 最好能翻译成中文的地址 仲永从幼年的天资过人却落得个“泯然众人”的结局,这个故事给了你哪些启发呢?请你从不同角度思考.(1)从仲永的经历来看(2)从仲永父亲的行为对仲永的影响来看 大虾和小虾有嘛区别?大虾比小虾大嘛. 英语翻译CALLE MARIA DE GUZMANNUM 58 Piso BJ 28003 MADRID 罗氏沼虾名字的由来 IT项目管理中线性规划的方法? 英语翻译街道:Avda,fuenlaburad65 地区:leganes Madrid Espana 韶山冲的读音“韶山冲”的“韶”怎么读?急用! 英语force;yenilated翻译什么 喜阴的农作物有哪些? 毛泽东的老家湖南省湘潭市韶山冲,“冲”是指什么?是行政单位吗? 英语翻译whose strength is proportional to the product of the objects' masses and inversely proportional to the square of the distance between them看了十分头昏… 在北方什么农作物喜阴 “韶山冲”中“冲”的意思是 光子为何能受到万有引力的吸引?这是困扰了我高三一年的问题.光子是能量体,不具有质量,根据万有引力定律,可以知道光子是不会受到黑洞的吸引的,可是为什么还说光子逃逸不了黑洞?除非光 什么作物喜阴 韶山冲为什么那么出名?韶山冲的“冲”是什么意思?湖南省湘潭市下辖的韶山市,有一个地方叫韶山冲,在全中国都很出名.一个小地方为什么那么有名气呢?韶山冲的“冲”是什么意思? 蝉的生命意义是什么, 兵的故事;”但此刻,他肯定是最感寒冷的一个人“?这句话和故事的结局有什么关系? 韶山冲的冲是什么意思 高柳乱蝉嘶上句是什么 有什么喜阴的作物啊?我想种在我家的大树下! 我就是L音不准,怎么发音, 那久别重逢造句 为什么说“但此刻,他肯定是最感寒冷的的一个人”?这句话和故事的结尾有什么关系?《兵的故事》天黑了.暴风雪呼啸得更加(愤怒 狂怒).一辆客车已经被暴风雪困在公路上六七个小时.车上 人有悲欢离合,月有阴晴阳缺,此事古难全,但愿人长久,千里共蝉娟, 一个正方形,它的周长等于它的面积吗? 《兵的故事》中为什么说"但此刻,他肯定是最感寒冷的一个人”?这句话和故事的结局有什么关系?” 但愿人长久,千里共蝉娟. 面积为121平方厘米的正方形的周长是多少厘米?11乘11等于121 11这数字从哪来的? 为什么说但此刻,他肯定是最感到寒冷的一个人?这句话和故事的结局有什么关系天黑了.暴风雪呼啸得更加(愤怒 狂怒).一辆客车已经被暴风雪困在公路上六七个小时.车上二十几名乘客中,有 但愿人长久,千里共蝉娟. 正方形的周长等于圆的周长,那么它们的面积 中华人民共和国第十一届全国人民代表大会第二次会议是什么时候开的 但愿人长久,千里共蝉娟.的意思? 代表拼音“xi ji”的文字是什么? 第十一届全国人民代表大会第四次全体会议什么时候召开? 祈祷的音怎么读 我想去外国读高中,但是英语不好,家境也一般,去国外读高中哪个国家便宜一点,需要哪些准备? 第十一届全国人民代表大会什么时候开始,什么时候结束? 但愿人长久,千里共蝉娟!这句话的正确解释是什么? 弃捐勿复道 努力加餐饭. 方仲永从神童到“泯然众人”,这种变化的根本原因是用原文回答 “L”的发音不准怎么办 弃捐勿复道,努力加餐饭 方仲永由神通到泯然众人矣的三个原因是什么 发音不准(了.来)的音说不好怎么办?那位亲知道发音不准怎么治疗.了来说不好 上医院看了有的说要割舌系带有的说割了没用 .不知道怎么办了唉 犀利仁师中 弃娟勿复道 努力加餐饭 是 二成美国人称见过鬼 女性比男性更易“美国万圣节迎购物潮 商家赠特色礼品揽美国多地举行万圣节游行 街头惊现“包日本政府拟制定相关措施援助海外核爆受德银:离岸人民币外汇期权市场迅速发展日本防相:监视中国海军演习符合国际法北京一周内两发空气重污染蓝色预警黑龙江青年支教山西10余年 月俸仅6国家卫计委公布社会抚养费相关行政复议中纪委:严禁公款购买印制寄送贺年卡等网络黑手偷袭中国“金融阵地”破坏经济2013年第32届伊斯坦布尔国际书展今年全国平均雾霾日数为4.7天 系5风行网日均覆盖超对手 一不留神成土豪佛山“栏脆脆”案终审 被害方诉求获得徐州“交巡警乱罚款”处理结果 停职撤云南泸西致9死爆炸枪击案2名主犯被执中纪委要求严禁公款购买印制寄送贺年卡中央下拨综合开发资金8.05亿元支持两部委取消314项行政性收费生效 重江苏环保厅总工:今年最后两个月霾污染试乘4号线 市民打出90分光谷智慧园 全面启动招商假借抓非法营运 “伪路政”骗车官员欲起诉律师“侵犯名誉”双流机场T2航站楼新增车位125个神奇的醋蛋明天,晨报新年特卖惠火爆开抢河北“土地银行” “存”出土地新模522增高峰短线车武汉门户建6万方华中建材旗舰标杆店成都地铁迎首只导盲犬越秀·星汇云锦26℃悦冬豪宅火热亮相吴东魁再捐助 10所希望学校洪山广场竣工在即创业一年,产值300万“健康”爹爹医用氧不离鼻地铁志愿者借机探路4号线这个冬天为何不冷?两男子冒充城管收卫生费“双簧”罚款武汉CBD牵手招行 助圆企业置业梦
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘