功能强大的SendMessage函数

本文介绍了Windows API中的SendMessage函数,它可将消息发送到指定对象以产生特定动作。以Visual Basic为例,结合多行TextBox处理、控制组合框下拉列表、列表框查找匹配项目、为ListBox添加水平滚动条等实例,展示了该函数能减少代码量、提高执行效率的强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

功能强大的

SendMessage函数

Windows API(应用程序接口)是Windows系列软件为程序开发人员提供的火力强大的“武器库”,在这个武器库中,有很多极具威力的武器,SendMessage就是其中之一,它的功能非常丰富,灵活使用这个函数,会给编程工作带来很多便利,本文以Visual Basic

为例,结合几个具体的例子介绍该函数的功能。

一、

SendMessage函数简介

顾名思义,

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.hWndForm1.hWnd分别可以得到Text1Form1的句柄。
      • wMsg:被发送的消息。

      根据具体需求和不同的对象,将不同的消息作为实参传送,以产生预期的动作。

        • wParamlParam:附加的消息信息。

        这两个是可选的参数,用来提供关于

        wMsg消息更多的信息,不同的wMsg可能使用这两个参数中的012个,如果不需要哪个附加参数,则将实参赋为NULL(在VB中赋为0)。

        在简单了解了

        SendMessage
        函数的格式和功能后,让我们以几个例子来看看它的威力:

        二、

        SendMessage函数使用实例

        1、多行TextBox中的快速处理功能

        在处理多行

        TextBox时我们经常会碰到以下几种情况:
        • 希望了解多行
        TextBox中目前共有多少行文字;
        • 想快速返回第
        N行的文字;

        对于上面的情况,如果用

        VB自身的语句或函数来实现的话,要写不短的代码,而且由于要采用顺序查找的办法来完成,因此代码的执行效率也很低。如果使用SendMessage函数则可以大大减少代码量,并大幅度的提高执行效率。

        SendMessage函数完成上面两个任务的方法非常简单,每个任务只需简单地发送一条消息给多行TextBox即可,两个消息分别为:EM_GETLINECOUNT EM_GETLINE,其它参数和返回值见下表:

        消息常量名

        消息值

        wParam

        lParam

        返回值

        EM_GETLINECOUNT

        &HBA

        未用

        未用

        行数

        EM_GETLINE

        &HC4

        要找的行号

        存结果的字节串

        结果字节串的字节数

         

        下面用一个简单的实例演示这两个功能:

        新建工程,在

        Form1上添加三个TextBox,名称分别为Text1txtLineCountTxtString,将Text1MultiLine属性置为True,三个标签和一个命令按钮。为工程添加一个模块Moudle1,在其中写如下声明(其中SendMessage函数的声明可以从VB的“API浏览器”中复制):

        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行的文字。

        wpe68.jpg (13238 bytes)

        两点补充说明

        :在调用
        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

        当程序中某处需要拉下组合框

        Combo1的列表时,写如下调用语句:

        SendMessage Combo1.hwnd, CB_SHOWDROPDOWN, True, 0

        当需要收起组合框

        Combo1的列表时,写如下语句:

        SendMessage Combo1.hwnd, CB_SHOWDROPDOWN, 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

        wpe69.jpg (14265 bytes)

        通过上面几个例子,想必您已经对SendMessage函数的强大功能有了初步的了解,事实上利用该函数我们还可以完成更多更好的任务,如控制文本框的自动滚屏、实现文字编辑过程中的Undo功能、操纵应用程序的窗体控制菜单等等,感兴趣的读者请参阅有关Windows API的资料。

         
        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

        当前余额3.43前往充值 >
        需支付:10.00
        成就一亿技术人!
        领取后你会自动成为博主和红包主的粉丝 规则
        hope_wisdom
        发出的红包
        实付
        使用余额支付
        点击重新获取
        扫码支付
        钱包余额 0

        抵扣说明:

        1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
        2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

        余额充值