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

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

Access下如何使用通用对话框-VB资料 ADO简介 -VB资料 ADO三大对象的属性、方法、事件及常数(二)-VB资料 ADO三大对象的属性、方法、事件及常数(三)-VB资料 ADO三大对象的属性、方法、事件及常数(一)-VB资料 Data 控件使用有密码的 Access 数据库 -VB资料 Excel、Access、VB的结合应用 Microsoft SQL Server 7.0安装问题(二)-VB资料 主题: MDB文件的导出 使用 DAO-VB资料 Microsoft Access秘密、技巧和陷阱-VB资料 SQL的基本操作(1.数据类型) -VB资料 SQL的基本操作(2.数据库的相关操作)-VB资料 SQL的基本操作(3.表的相关操作) -VB资料 SQL的基本操作(4.数据的检索)-VB资料 SQL在VB中的使用及访问远程数据库 Text 转换为 Access MDB -VB资料 VB5.0数据库基础 非编程方式访问数据库-VB资料 VB用编程方式访问数据库 VB 5.0数据库设计技术讲座(4) VB5.0数据库编程经验小集 VB5在处理数据库时的几个“BUG” VB6.0中的几个新增数据库工具 VB处理数据库时求数据表记录总数的最佳方法 VB访问数据库的方案比较 VB数据库编程经验两则 VB数据库编空字段的处理 VB数据库多字段记录的录入 VB数据库记录查询四法 vb应用程序访问sql server方法探讨 VB中超长OLE数据库字段的操纵方法 如何制做帮助文件? 一个XML绑定数据集的问题? 多层数据库一问!!!!!!!!!!!!!!!!!!!!!!!!!! 关于winvnc(在线等待) 请问“数据结构”这门课主要是学什么的? 这个毛病是什么原因?(加急,肯请赐教) 在线等候?自定义控件问题? 请问知道进程的ID值和句柄,能否控制程序窗口的大小? 多层数据库疑问!!!!!!!!!!!!!!!!!!!!!!!!!!! 关于IBM AS/400 DB2数据库编程 怎么从_streamptr 中恢复 recordset? 与数据库建立联接的后续问题 早上偶然看见前女友从眼前走过,突然有种莫名的感动 歌词和音乐同步问题?winnap的歌词插件基于什么样的原理做出来? 一个菜鸟的苦恼!! 用命令行配置IIS的命令是什么? 看看这个程序到底错在哪? 查找点对象问题,各位进来帮我看看 各位朋友一定请帮忙,关系到我工作问题(不是很难) 用ASP和Javascritp或Vbscript配合将SQL Server里的数据在客户端转换成EXCEL文件 Application的问题,急 谁能告诉我《银色幻想》在哪里有得下,万分感谢!!给分多多 新開一貼,sql語句請教,急,給分!!! 局域网内指定IP出现“该静态IP地址已经使用”,原理如何,如何编程实现。 一个语句的写法,up者有分 关于数据汇总的精典SQL语句求教! 有奖捉疵 50分 怎么打*****号部分的代码总不执行啊? 请问如何列举当前打印机支持的纸张信息? 歌词和音乐同步问题?winnap的歌词插件基于什么样的原理做出来? 急救!!!关于对话框中编辑框重画问题 小问题。。。。只想知道为什么。。。。 转载(贫富悬殊的中国) !!!用ASP能否实现一次上传一整个目录下所有的文件(子目录不算)?高手请答复! TreeView专题讨论 j2me中请问如果将textField中的内容写入到moto388手机的记事本中? 在vc中调用其他的exe include 另外一个jsp文件时,能向那个文件传参数吗?不能的话,有其他办法吗?谢谢 系统不能识别DaysBetween,如何处理 请问如下通过web连续下载图片,只是第一张要提示,以后每张就不再提示了? 关于ADO驱动MDAC版本的疑问 兄弟要工作了,是不是只要见到领导都要打次招呼? 我的问题!! 最近在用MFC写GDI程序,请前辈们给点建议 老兄给一些建议啊!用VB做什么毕业设计比较合适啊? 急,获取主板信息的问题! 请教finder的排序问题 mysql对一个数据库中表的数量有没有限制? 100分,急求控件的编写方法~!!!!我在做的项目想用到类似于vc编译器左边的class,resource,file view的窗口控件,谁有? 为什么我收到的邮件列表每次都是乱码?怎样打开? 大家帮看看这段代码哪出问题了,在线给分 求高效统计算法(在线等待,采纳着需要分来信200) 把16根火柴首尾相接,围成一个等腰三角形,你能围出等腰三角形吗?若能围成等腰三角形,那你再试试看,那你再试试看做多围成多少种不同的等腰三角形 高等数学空间几何求:空间中一曲线上指定点的法向量如何求 假设望远镜的光轴已经垂直于分光计的中心转轴,而平面反射镜面与中心转轴之间还有一个角度a,而此时反射回去的小十字像和平面镜转过180度后反射回去的小十字像和平面镜的位置应该是怎 日本明治维新是什么性质的改革 歇后语 爱好旅游—— 育英小学校园里用81盆鲜花摆放了一个方阵花坛,最外层每边有鲜花多少盆?最外层一共有多少盆鲜花 日本明治维新的性质从什么变为什么? 空间几何、、、、、 根据意思,写出相应的谚语1.功夫到了家,事情自然就会成功.( )2.刚出生不久的小牛,不怕老虎.( )3.人总是希望生活得更好.( )4.比喻单方面闹不起事来.( )5.各行各业都有杰出的人才.( 明治维新是什么时间进行的什么性质的改革 求与表现个人爱好有关的诗词歌词谚语等作文用,写在开头、结尾.帮下忙,谢谢 指对人谀奉承,刻意讨好、指说话不切实际,好夸口、喜欢表现自己,处处要强、根据意思写出三个字的歇后语 有没有单面反射 单面透射的材料?有没有一种材料薄膜或多种材料的组合,当光从一面射入时,透射率很高反射率很低,而从另一面入射时反射率高透射率低? 已知一次函数图像经过点[6,0]和点[10,8],写出函数解析式 甲、乙两个实心正方体物块放置在水平地面上,甲的边长小于乙的边长.以下做法中,有可能使两物体剩余部分对地面的压强相等的做法是 ( )A 如果它们的密度相等,将它们沿水平方向切去相等高 机械能守恒定律的条件一个木块从光滑斜面滑下,因为只有重力做功,木块机械能是守恒的如果斜面是不光滑的,木块受摩擦力,又给木块施加一个和摩擦力大小相等,方向相反的力F,那么还可以认 We can't have people ___ late all the time (arrive) 小明同学利用太阳光测量凸透镜的焦距.他注意到让凸透镜正对太阳光,但没有仔细调节纸片与透镜的距离,在纸片上的光斑并不是最小时,就测出光斑到凸透镜中心的距离l.那么,凸透镜的实际焦 机械能守恒定律的应用质量为m的滑块放在光滑的水平平台上,平台右端与水平传送带相接,传送带的运行速度为v,长为L,将滑块缓慢向左压缩固定在平台上的轻弹簧,到达某处时突然释放,当滑块 求与表现个人爱好有关的诗词、歌词、谚语等写作文用,用在开头、结尾. 根据雾的成因不同,分为辐射雾、平流雾、上坡雾和什么? 利用机械能守恒定律. 与您的提问“桌面高为H质量为m的小球从离开桌面高h处自由落下,不计空气阻力,假设桌面处的重力势能为零,求小球落到地面前瞬间的机械能详细步骤不要只写公式 已知函数Y=KX+1与Y=-0.5+B的图像交于点(2,5),求一次函数Y=4X-4与Y=-X+6的交点坐标,K,b的值 平流雾是什么东西 机械能守恒定律在一个系统中如何应用阿?我想知道到底怎么用阿,都变成两个物体了 关于母亲动作描写 平流雾是怎样形成的? 如何更好的运用机械能守恒定律 为什么斜坡拉物体摩擦力比平面大 重庆的雾是平流雾还是辐射雾? 波长400-760nm的白光入射光栅在30°的衍射观察到第二级主最大,并能在该处Δλ=0.005nm两条谱线,可是30°方向难观察400nm主最大求光栅常数d光栅缝宽b光栅总宽度D 开普敦起雾原因 列举两条长沙市典型的人文地理现象 石灰碱是氢氧化钙吗 用分光计.光栅测钠光波长误差太大标准值是5893,而我总是测得59多的甚至是61多的,请问可能哪里操作错了(我同学算得误差0.069%的) 关于长沙地理关于长沙地形地貌的介绍 英文的 可能我需要更详细具体的,关于地形地貌的, I am also confused the original one before ,I have been lonely 妈妈炒菜的一件事人物描写400字以上 美的空调扇使用制冷时要不要在水箱中加水啊?为什么我加水再放冰晶后按加湿不会制冷啊? 如何在数轴上做出原点的距离为根号5的点 光源距分光计较远,会有什么影响 买了台美的空调扇AC120-G,制冷时,要放入冰冻的冰晶盒,那冰晶盒是不是要冻成冰块啊,还是只要是冰的就行了? 南半球有美有亚寒带针叶林气候?为什么? 指一无所有的人,打一三字歇后语 英语翻译“可能我不是个很好的人”这么说对吗?该怎么说? 当整数m为何值时,直线5x+4y=2m+1与直线2x+3y=m相交于第四象限? 求一个塑钢型材配方给一个国标的配方就好 No,I am not.求中文翻译! This is the second time I have been___by that person,I shall never trust him againA:inadequateB:disappointingC:let downD:unsatisfactory选哪个?为什么?(我现在正在初学英语, 求三个字的歇后语指一无所有的人 现在哪些牌子的有氟空调扇好?价格是多少?有氟空调扇与加水的空调扇区别优势在哪里?看了很多评论都是说空调扇不好,不是很制冷,但是我有段时间住朋友家感觉还可以,晚上还有点冷必须盖 为什么南半球附近没有亚寒带针叶林气候? 现在塑钢型材什么配料最好? 地质时代怎么具体区分? 机械能守恒定律问题?斜面倾角θF的功率不变,可使物体沿倾角为θ的斜面以速度v匀速上升;若此力拉着该物体沿斜面下滑,可以速度2v匀速下滑;若此力拉着物体在同样路面的水平面上运动,则 三次函数的图像经过(-1,6),(0,8),(1,8)三个点,求它的解析式. 只一无所有的人三字歇后语 用100根火柴首尾相接围三角形,最多可以围成多少种不同的等腰三角形 表示高兴,喜欢的歇后语各2句 二项系数和跟系数和有什么区别 乌克兰传奇拳王参选总统 支持率高于现美警察7枪射杀持假枪少年 枪案频繁导沙特威胁将疏远美国 分析称美地缘政治肯尼迪家族亲戚杀人案将重审 72年还美油轮在尼日利亚遇袭 两人被海盗劫为美国官员在社交网站说总统\"坏话\"星巴克CEO辩解在中国高定价 称报道加拿大魁北克发现丰富稀土矿资源奥巴马医改核心举措因漏洞频出接受国会国际货币基金组织敦促美国应对中长期财两名美籍船员在尼日利亚遭绑架南桑威奇群岛东部25日发生6.5级地美油轮在尼日利亚遇袭 两人被海盗劫为美元对主要货币汇率24日继续在低位小纽约股市股指24日上涨纽约商品交易所黄金期货市场24日交投美国对中国和印尼产味精发起双反调查美“杀死中国人”节目被删 万人在白宫加拿大魁北克发现丰富稀土矿资源美国官员在社交网站说总统\"坏话\"深秋“平补”有讲究换装“节水宝”马桶不漏水10对服刑夫妻首次“团聚”打开手机就能查食药信息曼城赢球泄愤利物浦必胜无疑50元买两万条个人信息 被刑拘英拉5年内被禁从政漳、厦俩彩民玩机选 同期收获大乐透2奥巴马拒见以总理一个蛋三种口味“混蛋”受欢迎轻信网购退款 卡被盗刷两万平潭对台客滚航线 将实现每天开航福州市建委制定应急预案暴力抗法 两骑手被拘留福州开发区30周年 文艺晚会昨晚上演索罗斯这次真退休了浙大法学院现“神考题”闽侯女早产“袖珍”双胞胎57岁福州大姐 16小时内跑完100不断增强福建文化凝聚力“孩子走了,让他活在别人身上吧!”男子以为走了桃花运
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘