功能强大的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的资料。


VB部分相关文章推荐:


☆VB 读写TXT文本文件函数

☆VB 提取TextBox 文本框中指定一行字符串

VB 获取汉字拼音的首字母

☆VB 汉字字符串转换成拼音

☆VB判断指定名字的进程是否存在函数

☆VB 两种方法实现热键

☆VB 使用SendMessage枚举文件与目录

☆VB 二进制数组与十六进制字符串相互转换

☆VB 二进制数据读写实例

☆VB 进制转换大全(十进制、十六进制、八进制、二进制、二进制流)互转

☆VB 判断是否文本文件

☆VB 读取UTF-8编码文件函数

☆VB 按指定编码格式写入文本文件

☆VB UTF-8 URL编码函数

☆VB 实现UTF-8 与GB2312互转

☆VB 设置ListView中指定一行的背景颜色

☆VB SendMessage向其他程序窗口发送字符串消息实例

☆VB Listview导出到CSV文件函数

☆vb卸载所有窗体

☆VB中Null, Empty, Nothing, and vbNullString的区别

☆利用API函数计算程序运行时间VB

☆获取快捷方式原文件路径vb路径

☆利用VB函数Dir()实现递归搜索目录

☆VB数组的清除和重新定义

☆用RtlAdjustPrivilege来调整进程权限(VB6.0代码)

☆获取对象的接口信息(方法/属性/事件)(VB6代码)

☆VB6中给数组赋值的限制

☆[vb]一些窗口消息的详解

☆VB直接播放EXE文件中的声音文件

☆VB中利用CopyMemory使用指针

☆VB读写注册表的三种方法

☆[VB]SaveSetting 语句 和 DeleteSetting 语句

☆VB APP对象属性一览表 + 灵活使用VB的APP对象

☆[vb]SendMessageA函数

☆使用VB绘制抛物线动画曲线

☆关于vb中的容器

☆[vb]利用WScript.Shell对象隐藏cmd命令行运行

☆浅析VB For Each.Next语句

☆VB中窗体模块、标准模块、类模块的区别

☆引用 VB类模块

☆VB中什么是类,类模块有什么作用

☆VB SendKeys 语句

☆VB 全局热键

☆用VB轻松调用其他程序

☆vb读取txt文件到textbox

☆如何去优化你的VB程序3

☆如何去优化你的VB程序2

☆如何去优化你的VB程序1

☆[VB]在状态栏中显示帮助信息

☆[VB]把屏幕保存为图像

☆Mp3Play.ocx控件让音乐之声响起来


更多精彩>>>

[vb]SendMessageA函数相关推荐

  1. c语言strlren函数的原代码,VB常用函数

    现在的编程软件像VB,C++等,大多自带功能很强的函数库,可以很省力得完成各种功能.很多时候,想不起来实现某个功能的函数或函数格式,导致编程大费周折.作为一个编程人员,我对此深有体会.因此,特地准备了 ...

  2. VB CreateObject函数

    创建并返回一个对 ActiveX 对象的引用. 语法 语法语法 语法 CreateObject( CreateObject(CreateObject( CreateObject(class,[serv ...

  3. 计算机vb常用计算公式,计算机等级考试二级VB常用函数解析

    p=ABS(X):取X的绝对值. p=Log(X):求X的自然对数. Y=Sgn(X):符号函数. 说明: X>0时Y=1;X=0时 Y=0;X<0 时Y=-1. 例: Response. ...

  4. c语言中菲薄拉次数列,在VB子函数如何写出菲薄拉起数列

    VB编制角度(度,分,秒)转为弧度的子函数 PublicFunctionRAD(ByValDEGREEAsString)AsDoubleRem具有测试DEGREE的前面是否带有"+" ...

  5. 计算机vb输入框函数,VB数据输入函数inputbox

    有时需要在程序运行后,给变量输入数据,VB提供了数据输人函数. | 格式:InputBox(prompt[,title][,default][,xpos,ypos][,helpfile,context ...

  6. VB MsgBox 函数 了解一下

    了解具体函数 推荐网址 点击打开链接 MsgBox是Visual Basic和VBS中的一个函数,功能是弹出一个对话框,等待用户单击按钮,并返回一个Integer值表示用户单击了哪一个按钮. MsgB ...

  7. [黑科技] WPS通过VB宏函数实现自编号功能

    这篇文章主要是作为李老师<算法设计与分析>助教课程中,与她交流,学到的一些基础知识.它主要是讲述Word通过宏函数设置一些操作,比如在Word全文中替换一些符号:再如对Word上角表进行编 ...

  8. VB execl函数 word文档 KBS

    文章目录 1. VB 1.1 程序结构 1.2 基本语法 1.3 数据类型 1.4 变量 1.4.1 变量声明 1.5 常量和枚举 1.5.1 声明常量 1.5.2 声明枚举 1.6 数据库 2. K ...

  9. oracle的weekday函数,VB weekday()函数的用法?

    WEEKDAY函数是Excel函数. 返回值为一个数字,表示星期几.常使用WEEKDAY函数计算某天为星期几. 语法: WEEKDAY(serial_number,return_type) seria ...

最新文章

  1. 『干货』分享你最喜欢的技巧和提示(Xcode,objective-c,swift,c...等等)
  2. convert-----Linux中的图片处理工具
  3. ubuntu创建vim php文件,在ubuntu 上配置vim的php开发环境
  4. 2021-02-25
  5. HeartBeat 集群组件概述
  6. Vmware虚拟机里面的linux系统ping不通宿主机的解决方法(注意同时安装vmware和vbox虚拟机)
  7. 异常详细信息: System.UnauthorizedAccessException: 对路径“”的访问被拒绝。
  8. 2018.10.31国家统计局行政省市区数据and数据库建表
  9. 【北京迅为】i.MX6ULL终结者硬件资源说明
  10. 1 k 1 k2c语言,一张图告诉你斐讯路由器K1S、K2,K2C的区别
  11. Mozilla5.0的含义
  12. 奖券数目 有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。 虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10000-99999),要求其
  13. 将电脑的无线网通过有线分享给其他设备
  14. KMP字符串模式匹配算法【精简代码模板】
  15. 计算机无法识别ipad2,iTunes无法识别iPad mini怎么办【解决方法】
  16. vscode代码自动格式化快捷键
  17. Maven基础——什么是Maven
  18. 软件开发项目影响进度因素及控制浅谈
  19. 衡水中学计算机老师,河北衡水中学|高三榜样教师风采展
  20. 项目管理如何提升项目中的执行力

热门文章

  1. 如何使用 Firefox 阻止指纹识别的侵扰?
  2. 只会写代码的程序员永远无法出色?!
  3. 腾讯回应多闪弹窗事件;京东要求员工梳理亲戚同学关系;雷军董明珠十亿赌局胜负已定 | 极客头条...
  4. 简说 Python 生态系统的 14 年演变
  5. 如何在面试时搞定 Java 虚拟机?
  6. 中台架构与实现:基于ddd和微服务 下载_为什么在做微服务设计的时候需要DDD?...
  7. eclipse里source的快捷方法_Eclipse快捷键大全
  8. Java 蜡烛图_分支-15. 日K蜡烛图
  9. python文件审计系统_Python代码审计实战案例总结之CRLF和任意文件读取
  10. 左移和右移的运算规则_一文读懂JavaScript位的与、或、异或、取反及左移右移操作...