功能强大的SendMessage函数

2016-02-19 12:52 51 1 收藏

下面是个超简单的功能强大的SendMessage函数教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

【 tulaoshi.com - 编程语言 】

WindowsAPI(应用程序接口)是Windows系列软件为程序开发人员提供的火力强大的“武器库”,在这个武器库中,有很多极具威力的武器,SendMessage就是其中之一,它的功能非常丰富,灵活使用这个函数,会给编程工作带来很多便利。本文以VisualBasic为例,结合几个具体的例子介绍该函数的功能。
  一、SendMeaasge函数简介
  顾名思义,SendMessage函数的功能是“发送消息”,即将一条消息发送到指定对象(操作系统、窗口或控件等)上,以产生特定的动作(如滚屏、修改对象外观等)。
  SendMessage函数在VB中的函数说明如下:
  DeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByvalhwndAsLong,ByvalwMsgAsLong,ByvalwParamAsLong,lParamAsAny)AsLong
  其中四个自变量的含义和说明如下:
  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浏览器”中复制):-align="middle"width="20">消息常量名->-align="middle"width="20">消息值->-align="middle"width="20">wParam->-align="middle"width="20">lParam->-align="middle"width="20">返回值->-align="middle"width="20">EM_GETLINECOUNT->-align="middle"width="20">&HBA->-align="middle"width="20">未用->-align="middle"width="20">未用->-align="middle"width="20">行数->-align="middle"width="20">EM_GETLINE->-align="middle"width="20">&HC4->-align="middle"width="20">要找的行号->-align="middle"width="20">存结果的字节串->-align="middle"width="20">结果字节串的字节数->

DeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong
  PublicConstEM_GETLINECOUNT=&HBA
  PublicConstEM_GETLINE=&HC4
  在Form1的代码模块中写如下代码:
  PrivateSubCommand1_Click()
  Dimstr(256)AsByte
  str(1)=1'最大允许存放256个字符
  '获取总行数,结果显示在文本框txtLineCount中
  txtlineCount=SendMessage(Text1.hwnd,EM_GETLINECOUNT,0,0)
  '获取第3行的数据放在str中,转换为字符串后显示在文本框txtString中
  SendMessageText1.hwnd,EM_GETLINE,2,str(0)
  txtString=StrConv(str,vbUnicode)
  EndSub
  之后,按F5运行程序,在多行文本框中随便键入几行文字,然后按下[确定]按钮,出现如图画面,说明程序正确统计出了总行数和第3行的文字。
  两点补充说明:在调用SendMessage获取第N行字符串时,lParam需要说明为字节数组,在调用完成后,再将字节数组转换为字符串;另外,调用前必须在lParam的前两个字节指明允许存放的最大长度,其中第一个字节为低位,第二个字节为高位,本例将高位(即str(1))置1.说明最大允许存放256个字符。
  例2程序控制拉下或收起组合框的下拉列来
  一般情况下,为了拉下或收起组合框的下拉列表,需要用键盘或鼠标进行操作,而有时我们希望程序运行的某个时刻自动拉出下拉列表(比如在一些演示程序中),为了实现这个目的,我们也只有借助于SendMessage函数,方法是发一个CB_SHOWDROPDOWN(&H14F)消息给组合框。
  在发CB_SHOWDROPDOWN消息时,wParam参数决定了是拉下列表(=True时)还是收起列表(=False时),lParam无用(设为0)。
  为说明具体的使用方法,下面提供简单的程序片段。首先在代码模块中做如下声明:
  DeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong
  ConstCB_SHOWDROPDOWN=&H14F
  当程序中某处需要拉下组合框Combol的列表时,写如下调用语句:
  SendMessageCombol.hwnd,CB_SHOWDROPDOWN,True,0
  当需要收起组合框Combol的列表时,写如下语句:
  SendMessageCombol.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合并在一起的代码和运行画面
  DeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong
  PublicConstLB_FINDSTRING=&H18F
  PublicConstLB_SETHORIZONTALEXTENT=&H194
  PrivateSubForm_Load()
  List1.AddItem"软件"
  List1.AddItem"电脑游戏"
  List1.AddItem"电视机"
  List1.AddItem"电视台"
  List1.AddItem"电脑"
  List1.AddItem"电脑游戏软件"
  '下一句为列表框添加水平滚动条
  SendMessageList1.hwnd,LB_SETHORIZONTALEXTENT,250,0
  EndSub
  PrivateSubText1_Change()
  '注意!当lParam传入的是字符串时,必须用ByVal传递
  List1.ListIndex=SendMessage(List1.hwnd,LB_FINDSTRING,-1,ByValText1.Text)
  EndSub
  通过上面几个例子,想必您已经对SendMessage函数的强大功能有了初步的了解。事实上利用该函数我们还可以完成更多更好的任务,如控制文本框的自动滚屏、实现文字编辑过程中的Undo功能、操纵应用程序的窗体控制菜单等等,感兴趣的读者请参阅有关WindowsAPI的资料。
  本文程序均用VisualBasic5.0企业版编写,在Pwin95环境下运行正常。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)->

来源:http://www.tulaoshi.com/n/20160219/1602212.html

延伸阅读
标签: PS PS基础
Photoshop这个修图神器不仅仅是设计师必备,很多普通用户在日常生活中也经常需要用它来编辑图片,更不要说天涯论坛上那些高手!帮我PS个美女在 我旁边之类的搞笑帖子能为我们带来多少欢乐了。不过,如果你已经是桌面PS软件用户,那么你会对iOS或是Android平台上的触摸版本感兴趣吗?并且,从鼠标键盘转向触摸屏操作,PS还会那么好用吗?带着这些疑...
在这一期的SendMessage函数应用中,我将向大家介绍如何利用消息函数来扩展树型列表(TreeView)控件的功能相信对于树型列表控件大家十分的熟悉,典型的应用就是Windows资源管理器中的目录列表。在VB中,树型列表控件包含在MicrosoftWindowsCommonControl6.0(也可能是5.0,视你的VB或者系统版本而定)中。在WindowsAPI中,有一系列的以TVM_开头的...
标签: 电脑入门
Windows操作系统都有磁盘碎片整理这一功能,只是人们印象中,以往的Windows操作系统的磁盘碎片整理过程都非常的漫长,但是 Win7却有所不同,与之前的各种版本操作系统相比有着很大的提升。这主要是由于Win7中对磁盘整理命令行增加了全新的参数命令。一起来看看怎么利用磁盘碎片整理功能为你的Win7减负加速吧! 首先,先从开始菜单中找到磁盘碎...
功能强大的免费办公软件OpenOffice.org体验 还在为找免费微软Office软件而发愁吗,不妨试试功能强大的OpenOffice.org 吧!OpenOffice.org 是一套免费的跨平台的办公室软件套件,能在 Windows、Linux、MacOS X (X11)、和 Solaris 等操作系统上运行。它与各个主要的办公室软件套件兼容。OpenOffice.org 是开源软件,任何人都可以免费下载、...
Office2010中功能强大的图片背景删除工具 图片背景删除功能是Office 2010中新增的功能之一,包含在2010版的Word、Excel、PowerPoint和Outlook之中。利用删除背景工具可以快速而精确地删除图片背景,使用起来非常方便。与一些抠图工具不同的是,它无需在对象上进行精确描绘就可以智能地识别出需要删除的背景。下面以Excel 2010为例,对该...

经验教程

376

收藏

34
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部