功能强大的SendMessage函数 vb编程

来源:百度文库 编辑:神马文学网 时间:2024/04/27 16:08:52
功能强大的sendmessage函数
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环境下运行正常