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

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

研发周报:帮助网站转换的六大黑色星期五规则 【开源专访】JFinal作者詹波:以极简方式实现Web项目的极速开发 2013中国智能交通与大数据技术峰会:迎接交通大数据新时代 大数据应用技术(上):加速创新,重塑世界 英特尔百度携手推出首个跨平台应用商店 12月9日:计算机软件第一夫人Grace Hopper出生 触摸屏将成笔记本标配 电脑行业或将迎来又一春 触摸4G,你必须要知道的那些事儿 TIOBE 2013年12月编程语言排行榜:Transact-SQL冲刺年度语言 敏捷开发的6个实战经验 【图文】走近华为企业业务与支撑万人技术团队的云数据中心 《习惯联盟》陈晓冬:与京东云合作让我们没有后顾之忧 流计算与批处理同现:畅享大数据时代的开源实践 挑战和机遇并存:大数据时代机器学习与可视化 【企业开源系列】收发一条Twitter推文的背后 在IE11中更快地获得您需要的内容 暴露程序员身份的8个行为 英特尔创新应用大赛大评审!创新也有中国风 苹果面临一问题:正源源不断地失去优秀工程师 初学编程者必知的五个网站 大数据基准测试专题论坛:基准测试是一把尚未完成的尺子 大数据应用(下):应用驱动技术,DaaS创造价值 大数据研究与发展专题论坛:大数据在各领域中的应用及发展策略 雅虎新目标:欲收购照片分享网站Imgur 移动开发工具访谈《近匠》第01期:七牛云存储—BaaS进化论 ShareSDK:A轮融资到位!将推社会化评论SDK 70美元,你也能用Raspberry Pi做个专属iBeacon基站 7个鲜为人知却超实用的PHP函数 从管理远程式团队和分布式团队中所获得的宝贵经验 Netflix开源数据流管理器Suro Google新创意:天花板加麦克风 人脑植芯片 使用asp显示柱状图 关于PDA中JAVA的编程 50分,一个5分钟就能解决的问题! 今日看到一篇文章,随便问问,希望有兴趣的高手过来指点指点!初学也进来讨论一下! Foxpro怎樣調用Winzip等壓縮軟件,有誰知道?請賜教! 关于窗体验证的问题,谁能帮我出一个更好的解决方案? 别不告诉我呀,给分大大地! 如何用ISA控制用户的上网流量 請問在VBScript過程中能用session 紧急求助:VC.NET怎么导入资源文件。(高分) 如何连接.dbf的数据库(dBase). 下拉菜单问题 请问如果一个控件没有hwnd,怎样才能拿到它的hwnd?急! 简单问题 请问如果一个控件没有hwnd,怎样才能拿到它的hwnd?急! 请问如果一个控件没有hwnd,怎样才能拿到它的hwnd?急! 在设计ActiveX控件时,怎么得到该控件的HWND 请问浮点型的数据如何设置使它以科学计数法表示? 高分求教:VPOP3的使用方法? 500分求解:windows编程。 请教高手,关于用TCP/IP检测网络状态 一个关于注册 ODBC 的问题,请教高手 控件得到焦点时有OnActive事件,那失去焦点时是什么事件 哎,不知做什么软件才能赚钱? 请教跨域访问的问题! 请高手帮忙!一定给分! 怎样编程实现在ListBox里显示数据库表中一个列?(绝对放分) 那位有《101规约》给我一份,我实在不知道该到哪里去找!!!(50分求助) 关于对话框制作 关于例外 给Cisco认证提点建议!给分===== [求教]XML文档的参数中如有&符号如何处理。 [求教]XML文档的参数中如有&符号如何处理。 谁能给我提供免费防刷新的计数器代码……在线等待 请问出现下列错误,如何解决!(怎样察看每个OLE DB状态值) 会话状态设置中的SQLServer 模式如何应用? BUG!版主管理里的专题管理 session 没设置正确,请蝈蝈看看 有朋友问我学习C语言初中学历能学会吗? 大家帮个忙,很简单的问题,快呀,关于数据库的问题 请问vb怎么打开Access2000的数据库? 计算机并行口原理是什么 我在前台的程序中对text1.text=rs!number,为何text1.text的值还是空值,想不通??? GetSafeHdc() 的含义及用法 一个调用SQL数据库的问题! 如何ML一个装载地址不是4M的EXE文件(比如6M或8M) 谁能说说从一个ListView拖动文件到另一个ListView中 如何在程序结束时播放一段动画再结束!!!!! 我要书 下面是我的存储过程,为什么多人操作的时候会发生死锁呢,急呀! 谁知道炖鸡怎么炖啊?加什么料? 如何使鼠标点到对话框外时关闭对话框?(方法越多越好) 求Lesley roy的when i look at you 的MP3下载 Our science teacher is very strict _____ us. 1997到2000年的四级英语题 英语阅读改错题 Japan is ___the east of China 长方体的对角线公式是什么 什么样的人会吸引苍蝇?或什么原因导致人吸引苍蝇? 愿意做并敢保证全对者请追问,我发阅读题目过来~ My favorite teacher is our science teacher.的同义句 吸引苍蝇的是什么? 英语阅读理解,联系发题 we can buy some apples for our teacher.some apples提问 求一篇初中的英语作文.my enjoyable trip ONE BAR怎么样 求NBA球星的经典名言……急啊~今天晚上就要!越多越好如果有英语麻烦翻成中文…… 求一篇英语作文(初中的)随着科技的发展,网路成了我们生活中不可缺少的部分.请你依据以下信息以“I like Internet”为题写一篇50词左右的文章,向我们介绍一下你身边的网络.1、上网获取信 If impossible to escape one\'s doom,bear the nba所有的名言名言! 一篇介绍自己的英语作文 作文中包括名字(中英)爱好及(喜欢的的原因),我喜欢这位给我讲课的老师,年龄,最好有创新,要有中文翻译,还有喜欢的宠物啊,食物啊,我喜欢老师讲的课,就这些, the continuous LED-bar indication changes to a single (momentary) one. NBA名人名言请问NBA有名的教练或队员说过哪些著名的话?例如汤姆贾诺维奇的“永远不要低估一颗冠军的心”.还有什么其他的名言?要名言和作者, 已知△ABC,∠A,∠B,∠C所对的边分别为a,b,c且a:b:c=13:12:5,△ABC是否为直角三角形?为什么?用勾股定理解 铝漆包线与铜漆包线线径如何换算? 帮我写些搞笑的NBA名言例如:加内特的是:血 汗 泪 科比的是:死也不传球 麦迪的是:高薪看球赛 何乐而不为 詹姆斯的是:乔丹是我小弟 加索尔的是:面条没我软 姚明的是:鲨鱼算啥 孙 已知直角三角形的直角边a=12,另一条直角边b和斜边c都为正整数,试求b、c的值.帮我朋友问的,最快回答且正确的有高赏 I am going to check my email m_____ this evening.按首字母填空Do you always t________ every word when you do some reading?并说出为什么? 在美国最有名的女演员 女歌手是谁?美国最有名的女演员 女歌手是谁?包括中国人艾玛沃特森在美国有名吗?一定要权威! 已知直角三角形的两条边分别为7和13,斜边为c,你知道c在哪两个整数之间吗?如果a ( )are you going to email her? 太阳升起时候的颜色是什么? ROY英文是什么 pool 太阳升起时阳光颜色的变化是怎样的肉眼看到的阳光颜色 英语roy的用法越详细越好 in the pool和at the pool 求新概念2,3的课文听力~如果有高中英语新课标(就是必修,选修那个)的听力,必修5+所有选修部分的听力(必修1-4不用了), 初二英语阅读选择,共15题,后面请追问, THE POOL怎么样 有一块锐角三角形铁片ABC,一直最长边BC=12cm高AD=8cm,要把它加工成一个矩形铁片求距形的面积 初二英语阅读,共三篇,题目请追问, 球三句名言的出处危险、怀疑和否定之海,围绕着人们小小的岛屿,而信念则鞭策人,使人勇敢面对未知的前途.——泰戈尔人只有献身于社会,才能找出那短暂而有风险的生命的意义.——爱因斯 形容非常熟悉的词语?比如说,你对滑旱冰非常非常熟悉,可以用哪些词语来形容? 初二英语阅读共三篇,后面请追问, Last night went to the bar a few friends come to three in the morning to drink three bottles of wine now head hurts求翻译 形容非常熟练词语? she was not the woman__she was before.为什么不选c a what b that c who d as 分析下语法:What good advice our teacher gave us!RT,初中、高一都没有好好学英语,邻近高三压力来了.因为advice是uncountable,所以good前没a,这我明白.就想问give sb.sth.中的sth.前置属于什么语法,强调? 形容熟练的词有哪些 正确的顺序 ①Which woman?②Who's that woman?③She's my teacher.④The one on the red bike.A.①②③④  B.①③②④  C.②③①④  D.②①④③ the missing boys were last seen _____ the Net Bar.A.enter B.entering C.to enter D.entered哪 个对呢?B还是C?为什么,有的说的不对,怎么会be seen 只能加doing 和do?不对,应是be seen to 谁还有高见,快说说 掌握的非常熟练,用什么词形容 直角三角形三边分别为a-b,a,a+b,a、b都是正整数,则三角形其中一边可能是 A 61 B 71 C 81 D 91 but looks identical to the last phone and does little to lift the bar for smartphones. 一百词英语作文.题:暑假是否去看世博暑假看世博的好处:有时间、和同学一起…暑假去的不便:天热,人多…你的决定.100词左右,必须用第一人称. (1/2)急:直角三角形的三边长为a-b,a,a+b,且a、b都为正整数,则三角形其中一边长可能为( )A.61 B.71 C...(1/2)急:直角三角形的三边长为a-b,a,a+b,且a、b都为正整数,则三角形其中一边长可能为( )A.61 B.71 C. 考研英语的权威辅导书有啥能写出来不? 英语四级2000年到2004年的真题 英语翻译He tried calling the number I gave himThe tide covered him upI can't save himHeaven openHe's half way to hell and backThe clouds darkness came right before himThe world threw him some curses and warningsHeaven open he's half way to hellNo 如果还有爱情用英文怎么说 英语的连词成句怎么写
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘