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快速读取 TextBox 第 N 行的资料

※VB禁止使用 Alt-Tab 或 Ctrl-Alt-Del

※生成迷宫的程序

※另一方法转换大小写

※VB控件注册 - 利用资源文件将dll、ocx打包进exe文件

※VB利用资源文件进行工作

※[转]vb高效编程(优化)

※VB阳历转阴历

※纯VB代码取得硬盘的物理序列号

※VB获得磁盘的文件系统

※做VB的,经常注册和反注册OCX控件和DLL链

※VB从程序中生成Exe文件

※VB6监视/操作剪贴板示例(VB6.0代码)

※VB6里自动提交/自动填表的一种相对通用的方案

※VB移动没有标题的窗体

※VB随机字母的函数

※VB删除带子文件夹和文件的文件夹

※VB怎样屏蔽 Alt+F4键

※VB 隐藏进程

※vb屏蔽文本框点右键时的弹出菜单

※VB手控Combobox的打开或收起

※在VB中INI文件的读写、删除(对中文支持很好)

※vb全局热键的写法(占很少的资源)

※vb取消文本框的粘贴功能

※VB常用文件操作类

※VB获取特殊文件夹

※VB获取windows各常用目录的函数(模块)

※VB生成太极图

※VB:常用内部函数大全,你会了几个呢?

※vb中SendMessage函数

※精简VB程序的代码

※VB:将数字转换为大写中文

※VB:设定 MsgBox 在若干时间之后若无回应则自动关闭

※VB:读取及设定NumLock/CapsLock/ScrollLock的值

※VB:您知道 Mid$ 函量可以放在 '=' 的左方吗

※VB后台获得按键,并执行自己的函数(非钩子及热键)

※VB:将短文件名格式转成长文件名

※在vb中使用Iphlpapi.dll获取网络信息(上)

※在vb中使用Iphlpapi.dll获取网络信息(下)

更多精彩>>>

vb中SendMessage函数相关推荐

  1. VB中DateDiff 函数解释

    VB中DateDiff 函数使用方法 DateDiff (interval, Date1 , Date2[,firstweekofyear[,firstweekofyear]])  返回一个Varia ...

  2. 浅谈windows 编程中SendMessage函数的妙用!!!

    windows编程中SendMessage函数是非常重要的,而且这个对于理解windows的消息机制也很重要.本文用代码的方式实现了一些功能,借以说明此函数之妙用.说明不当之处,希望批评指正,谢谢! ...

  3. VB中CopyMemory函数

    vb中copymemory函数的使用挺耐人寻味的.copymemory的使用说明资料书上就一句"该函数用于将一块内存的数据从一个位置复制到另一个位置".其参数数据类型destina ...

  4. php instr(),vb中instr函数怎么用

    vb中instr函数怎么用 instr函数的作用是从起始位置开始向后找到被搜索的字符串第一次出现的位置,如果找的到就返回其在原字符串中的位置,否则就返回0. 语法:instr( string1, st ...

  5. vb中Msgbox函数的应用。

    使用过Windows及其应用软件的人肯定熟悉如图1所示的消息框,这在VB中可用MsgBox函数来实现.

  6. VB中API函数的调用

    1.API函数       API的英文全称(Application Programming Interface),WIN32 API也就是MicrosoftWindows32位平台的应用程序编程接口 ...

  7. c语言findwindowex函数用法,VB中findwindowex函数的用法?

    FindWindowEx函数 函数功能:在窗口列表中寻找与指定条件相符的第一个子窗口 . 该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配.这个函数查找子窗口,从排在给定的子窗口后面 ...

  8. vb中msgbox函数用法

    在对话框中显示消息,等待用户单击按钮,并返回一个 Integer 告诉用户单击哪一个按钮. 语法 :MsgBox(prompt[, buttons] [, title] [, helpfile, co ...

  9. 在VB中INI文件的读写、删除(对中文支持很好)

    很多时候我们编一个程序不一定要用到注册表来保存设置(如果说一个程序没有设置就不算好程序了).INI是一个很好的选择.有人说,Savesetting是一个不错的选择,但是我了解到,不能永久的保存(起码在 ...

最新文章

  1. 英国政府发人工智能深度报告,力图保持领先地位
  2. 在emu8086中学习几个汇编语言显示字符串的小例子
  3. HDFS集中式的缓存管理原理与代码剖析--转载
  4. Head First JSP---随笔九(部署Web应用)
  5. Java学习之日期学习
  6. CodeForces - 343D Water Tree(树链剖分+线段树)
  7. apache lucene_Apache Lucene拼写检查器的“您是不是要”功能
  8. 语言还是你不得不服的大哥级别编程语言!
  9. 计算机组成原理输入实验报告,计算机组成原理实验 实验报告.doc
  10. 宏杉科技助力西安交大二附院:突破存储旧瓶颈、实现业务新成长
  11. tftp服务器怎么开启linux,CentOS 6.4 tftp服务器配置--使用tftp下载并启动内核
  12. table maker's delimma
  13. Docker - 常见操作命令篇
  14. python-字符串 修改间隔符 and定义变量 交换变量
  15. 炸金花游戏(4)--炸金花AI基准测试评估
  16. MyBatis基本工作原理
  17. 珍爱生命,远离微软,一点感受源自知乎上的某人评论
  18. 调试ASP程序时,遇到程序运行错误时怎么查看具体错误位置呢?
  19. CrossOver 22Mac和Linux免费中文版系统兼容工具
  20. unity3d实现场景右下角人物小地图(可显示出地图上人物的位置以及boss或者其他重要坐标的小图标)

热门文章

  1. 只想做程序员的钢铁侠埃隆·马斯克,是如何成为亿万富翁的?
  2. 8 个 Linux 下 ls 命令的高级用法!个个惊艳!
  3. Facebook的秘密服务器,竟藏着互联网的军事根源?
  4. 程序员探案之 Python 和 Redis 的“第三者”
  5. 阿里布局无人驾驶;滴滴成立汽车服务;“京东 AI 天团”首亮相| CSDN极客头条
  6. 你们这些程序员,真得每天都在读代码吗?
  7. 第 18 章 访问者模式
  8. mysql对所有id求积_sql 行列式 转换,
  9. python监控服务器信息进行可视化_Python实现数据可视化,看如何监控你的爬虫
  10. windows10升级助手_去哪升级显卡驱动最靠谱,千万别用驱动精灵,这些方法才稳...