VBSendMessage函数参数详解.docx

上传人:b****6 文档编号:6284675 上传时间:2023-01-05 格式:DOCX 页数:46 大小:44.86KB
下载 相关 举报
VBSendMessage函数参数详解.docx_第1页
第1页 / 共46页
VBSendMessage函数参数详解.docx_第2页
第2页 / 共46页
VBSendMessage函数参数详解.docx_第3页
第3页 / 共46页
VBSendMessage函数参数详解.docx_第4页
第4页 / 共46页
VBSendMessage函数参数详解.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

VBSendMessage函数参数详解.docx

《VBSendMessage函数参数详解.docx》由会员分享,可在线阅读,更多相关《VBSendMessage函数参数详解.docx(46页珍藏版)》请在冰豆网上搜索。

VBSendMessage函数参数详解.docx

VBSendMessage函数参数详解

VBSendMessage函数参数详解

SendMessage

函数原形

DeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong

四个参数的含义和说明如下:

  对象的句柄。

希望将消息传送给哪个对象,就把该对象的句柄作为实参传送,在VB中可以简单地用“对象.hWnd”获得某个对象的句柄,如和分别可以得到Text1和Form1的句柄。

它是一个长整型数。

Windows给每个控件一个编号,这个编号就称为窗口句柄。

有了这个句柄,我们就可告诉Windows我们要控制哪个控件,所以这个句柄在API调用中至关重要。

VB的大多数控件都包括hwnd属性,如下拉框、TreeView等,窗体也有这个属性。

但也有一些控件没有这个属性,如标签控件。

没有这个属性就无法利用WindowsAPI函数,但可以节省系统资源。

  被发送的消息。

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

使

SendMessage传递消息,大多是为了完成以下几个工作:

  ①设置控件的一些选项,象我们要使用的CB_SETDROPPEDWIDTH的就属于这种情况。

尽管VB的每个控件都提供了许多属性,但仍然有许多控件的选项没有包括在其中。

而这些选项中的大多数都可以利用该函数进行设置

  ②获得控件的一些设置。

同上一种情况相反,有时我们需要获得控件的一些设置,相当于读取属性。

例如,如果想知道一个下拉框的下拉部分的宽度是多少,就可以向控件发送CB_GETDROPPEDWIDTH消息。

对于这种情况,SendMessage函数的返回值就是结果。

  ③执行一定的操作。

例如,我们要在下拉框中寻找是否有“ABC”这个字符串,当然,我们可以编写

一个循环,逐条比较看是否存在这样的字符串。

如果使用API,我们只需要向下拉框发送CB_FINDSTRING

消息,这条消息就会自动进行查找工作并返回结果。

  ④模拟用户操作。

我们有时希望模拟用户的操作,比如关闭其他应用程序的窗口。

其实只要我们能知

道那个窗口的句柄,我们就可以发送WM_CLOSE消息给那个窗口,窗口接受到这条消息就会关闭,如同用户关闭窗口一样

、:

  附加的消息信息。

这两个是可选的参数,用来提供关于wMsg消息更多的信息,不同的wMsg可能使用这两个参数中的0、1或2个,如果不需要哪个附加参数,则将实参赋为NULL(在VB中赋为0)。

lParam定义为Any类型。

指定Any类型可禁止VB进行类型检查,从而允许将任意数据类型传递给该过程。

由于每条消息对参数的类型和传递方式的要求都不同:

有的可能要求为Long型,有的可能要求为自定义类型;大多数要求按传值方式传递,但也有一些要求按传地址方式。

为了满足各种要求,我们将这个参数定义为Any类型。

比如,我们要传递一个Long型变量lData。

如果消息要求传地址方式传递,可以使用:

SendMessage……,lData

  而如果要求传值方式传递,则使用

SendMessage……,ByVallData

  如果传递常数,我们则需要使用类型后缀来指定常数的类型,比如"0&",表示Long型的常数0,如SendMessage……,ByVal0&

  我们也可以使用类型转换函数CLng将常数指定为Long型,如CLng(0)。

  程序中,有时定义lParamAsAny,有时定义ByVallParamAsString。

这是为什么呢对于

SendMessage函数,lParam的使用是很灵活的,在一般情况下,lParam是一个指针,它指向的数据类型有三种:

长整形、自定义数据结构类型、字符串类型。

对于前两种类型,需要将lParam定义为lParamAsAny,从而将lParam数据的指针传递到SendMessage函数。

对于字符串类型,则需要定义ByvallParamAsString,因为字符串类型数据不同,只有定义ByVal,得到的才是字符串的指针,如果没有ByVal,得到的将是指向字符串指针的指针。

另外对于少数的消息来说,SendMessage函数需要的只是lParam本身的值,这时就需要将lParam定义为ByvallParamAsLong,或者在程序调用时在lParam之前加ByVal

  当用户在编辑控件上进行各种操作时,其父窗口将收到WM_COMMAND通知消息,lParam带控件句柄

(hWnd),同时wParam的低16位带控件的ID,高16位带有如下表的消息代码:

常用编辑控件消息:

EC_LEFTMARGIN(&H1)EC_USEFONTINF设置左边距时使用

EC_RIGHTMARGINEC_USEFONTINF设置右边距时使用

EC_USEFONTINF,O,边距设置编辑控件的左、右边距,当wParam含EC_LEFTMARGIN时在lParam的低16位指定左边距点数,当wParam含EC_RIGHTMARGIN时在lParam的高16位指定右边距点数。

当指定wParam为EC_USEFONTINFO时,则用当前字体的字符"A"的宽度指定右边距和字符"C"的宽度指定左边距lParam被忽略。

EM_CHARFROMPOS(&HD7=215),0,取得编辑控件中指定位置的字符相对于文本头部的偏移量。

使用本操作应先在第4个参数的高16位指定行号,低16位指定列号(或一个POINTAPI结构),行列是按编辑控件的客户区左上角为原点(0,0)计算的。

如果指定的位置超出控件客户区则返回-1

EM_CANUNDO(&HC6=198),0,0 决定前一次编辑操作是否能够撤消:

检测控件撤消缓冲区是否为空,通常控件把最后一次在控件的编辑操作保存在一个撤消缓冲区,如果缓冲区非空则返回TRUE表示上次操作可以撤消,否则返回FALSE,应用程序可以利用该返回值来禁止或允许菜单或工具条的"撤消"项。

EM_EMPTYUNDOBUFFER(&HCD=205),0,0清除控件的撤消缓冲区,使其不能撤消前一次编辑操作

EM_FMTLINES(&HC8=200) 决定是否在取回的文本宇串中包含软回车字符

EM_GETFIRSTVISIBLEINE(&HCE=206),0,0获得文本控件中处于可见位置的最顶部的文本所在的行号

EM_GETLINE(&HC4=196),行号,ByVal变量获取编辑控件某一行的内容,变量须预先赋空格

EM_GETLINECOUNT(&HBA=186,0,0获取编辑控件的总行数

EM_GETMODIFY(&HB8=184),0,0 判断编辑控件的内容是否已发生变化,返回TRUE则控件文本已被修改,返回FALSE则未变。

EM_GETPASSWORDCHAR(),0,0 获取编辑控件的密码字符,返回NULL表示没有字符

EM_GETRECT(&HB2=178),0,结构 获取编辑控件的格式化矩形

EM_GETTHUMB(&HBE=190),0,0取得多行文本编辑控件的滚动框的当前位置(注意:

是象素值)

EM_GETSEL(&HB0=176),0,变量获取光标位置(以字节数表示),或:

(缓冲区起点,缓冲区终点)取得编辑控件中选定内容的范围,返回值中低16位为起点,高16位为终点

EM_GETHANDLE(&HBD=189),0,0取得文本缓冲区

EM_GETWORDBREAKPROC(&HD1=209),0,0取得整字换行回调函数EditWordBreakProc指针

EM_GETLIMITTEXT(WM_USER+37=1061),0,0获取一个编辑控件中文本的最大长度

EM_GETMARGINS(),0,0获取编辑控件的左、右边距,返回值低16位为左边距,高16位为右边距(不得用于NT3.51)

EM_LIMITTEXT(&HC5=197),最大值,0设置编辑控件中的文本长度

EM_SCROLLCARET(&HB7=183),0,0把可见范围移至光标处

EM_LINEFROMCHAR(&HC9=201),偏移值,0获取指定位置(或:

-1,0表示光标位置)所在的行号

EM_LINEINDEX(&HBB=187),行号,0获取指定行(或:

-1,0表示光标所在行)首字符在文本中的位置(以字节数表示)

EM_LINELENGTH(&hC1=193),偏移值,0获取指定位置所在行(或:

-1,0表示光标所在行)的文本长度(以字节数表示)

EM_POSFROMCHARPOINT,结构地址,偏移值取得指定字符位置的行列号,偏移值是字符相对于文本头部的偏移。

EM_LINESCROLL(&HB6=182),列数,行数指定行数的文本水平滚动,每次滚动N列

EM_EXGETSEL(&H434=1076)

EM_EXSETSEL(&H437=1079),0,结构RichEdit控件设置文本选定范围,参阅EM_SETSEL消息,结构是指CHARRANGE结构

EM_PASTESPECIAL(&H440=1088),2

(1),1RichEdit控件粘贴剪贴板中的位图(或文本)

EM_FINDTEXT(&H738=1080)RichEdit控件正文搜索操作

EM_FINDTEXTEX(&H44F=1103)同上

EM_SETTEXTEX(&H461=1121)RichEdit控件正文替换/插入操作

EM_SETTARGETDEVICE,GetDC,/15)设置RichTextBox自动换行,后续代码是:

=iif=0,1,0)

EM_SETTARGETDEVICE,0,1设置RichTextBox不自动换行

EM_POSFROMCHAR(&HD6或&H426)判断指定字符在编辑控件的位置(用于NT3.51)

EM_SCROLL(&HB5=181),*,0文本垂直滚动。

第三个参数*控制滚动方向:

SB_LINEDOWN

(1)向下滚动一行,SB_LINEUP(0)向上滚动一行,SB_PAGEDOWN(3)向下滚动一页,SB_PAGEUP

(2)向上滚动一页。

EM_REPLACESEL(&HC2=194),1(0),字符串用指定字符串替换编辑控件中的当前选定内容,如果第三个参数wParam为1,则本次操作允许撤消,0禁止撤消。

字符串可用传值方式,也可用传址方式(例:

SendMessage,EM_REPLACESEL,0,'这是传值方式)

EM_SETSEL(&HB1=177),起点,终点设置编辑控件中文本选定内容范围(或设置光标位置),该范围被反相显示,用于为复制、替换、粘贴、剪切、删除等编辑功能指定范围,光标将被移至指定的终点后面。

还可使用指定相同起点和终点来移动光标而不是选定范围。

当指定的起点等于0和终点等于-1时,文本全部被选中,此法常用在清空编辑控件。

当指定的起点等于-2和终点等于-1时,全文均不选,光标移至文本未端,此法常用在文本未端追加内容。

注意:

当控件没有输入焦点时,本操作将会失败,一般在执行本操作前都应调用SetFocus先取得输入焦点。

EM_UNDO(&HC7=199),0,0撤消前一次编辑操作,当重复发送本消息,控件将在撤消和恢复中来回切换

EM_SETCHARFORMAT(&H444)改变选定文本的颜色

EM_SETHANDLE(&HBC=188),缓冲区指针,0为编辑控件指定新的文本缓冲区。

此操作仅适用对话框创建带DS_LOCALEDIT风格的控件。

EM_SETLIMITTEXT,长度(字节),0设置编辑控件中的文本最大长度(不得用于NT3.51)

EM_SETMARGINS(&HD3=211)设置编辑控件的左、右边距(不得用于NT3.51)

EM_SETMODIFY(&HB9=185),1(0),0设置或清除一个编辑控件的修改标志

EM_SETPASSWORDCHAR(&HCC=204),字符,0指定控件用来显示密码的字符,缺省为"*"。

当第三个参数wParam为0时,本操作将清除控件的ES_PASSWORD风格,并按实际字符显示。

EM_SETREADONLY(&HCF=207),1(0),0决定是否将编辑控件设为只读,同时决定控件的ES_READONLY风格

EM_SETRECT(&HB3=179),0(或RECT),结构地址为一个编辑控件设置格式化矩形

EM_SETRECTNP(&HB4=180),0(或RECT),结构地址为一个编辑控件设置格式化矩形,只是控件此时不会重画

EN_CHANGE(&H300=768)编辑控件的内容发生改变。

与EN_UPDATE不同,该消息是在编辑框显示的正文被刷新后才发出的。

EN_ERRSPACE(&H500=1280)任何时候只要由于内存不足以完成一项编辑操作

EN_HSCROLL(&H601=1537)用户单击了编辑控件的水平滚动条。

注意:

这条消息是在控件更新显示之前发送出去的。

EN_VSCROLL(&H602=1538)用户单击了编辑控件的垂直滚动条。

注意:

这条消息是在控件更新显示之前发送出去的。

EN_KILLFOCUS(&H200=512)编辑控件失去了输入焦点

EN_SETFOCUS(&H100=256)编辑控件获得了输入焦点

EN_UPDATE(&H400=1024)控件准备显示改变了的正文时发送该消息。

它与EN_CHANGE通知消息相似,只是它发生于更新文本显示出来之前。

EN_MAXTEXT(&H501=1281)用户输人的文字数超出由EM_LIMITTEXT消息规定的界限,或超出由VBMaxlength属性规定的界限,就会发送这条消息。

此外,倘若不允许自动进行水平滚动,同时插入点要超出控件的宽度;或者不允许自动垂直滚动,同时插入点要超出控件的高度,那么也会触发这条消息。

在没有ES_AUTOHSCROLL或ES_AUTOVSCROLL的编辑框中,当正文超出了编辑框的边框时也会发出该消息。

编辑风格消息:

ES_MULTILINE 指定编辑控件能否进行多行文本编辑,若多行编辑器不指定ES_AUTOHSCROLL风格,则会自动换行,用户每按一次Enter,在当前光标处输入一个回车换行符(0Dh,0Ah),文本增加一行。

若不指定ES_AUTOVSCROLL,则多行编辑器会在窗口中正文装满时发出警告声响。

ES_LEFT文本显示居左

ES_CENTER文本显示居中

ES_RIGHT文本显示居右

ES_LOWERCASE把用户输入的字母统统转换成小写字母

ES_UPPERCASE把用户输入的字母统统转换成大写字母

ES_OEMCONVERT 把输入的文本从ANSI码转换成OEM码,然后又转换成ANSI码,目的是保证函数AnsiToOem的正确调用。

这在编辑框中包含文件名时是很有用的。

ES_AUTOHSCROLL(自动增加水平滚动条)当用户在行尾键入一个字符时,正文将自动向右滚动10个字符,当用户按回车键时,正文总是滚向左边。

ES_AUTOVSCROLL 当用户在最后一个可见行按回车键时,正文向上滚动一页。

ES_NUMBER 只接收数码输入,其它字符输入一律无效。

ES_NOHIDESEL(&H100=256)当编辑框失去输入焦点时,选中的文本将隐藏,正文中的选择保持不变。

缺省时正文中的选择将失效,当获得输入焦点后才又显示出来。

ES_READONLY将编辑框设置成只读的

ES_PASSWORD(&H20=32)使所有键入的字符都用"*"来显示。

ES_WANTRETURN 使多行编辑器接收回车键输入并换行。

如果不指定该风格,按回车键会选择缺省的命令按钮,这往往会导致对话框的关闭。

列表框操作:

LB_FINDSTRING(&H18F=399),-1,ByVal字串查找列表项的字符串,返回值=字符串所在的列表项的索引。

-1表示从第0行开始查找,如果改为一个有效的列表项索引值,将从该行开始查找。

LB_ITEMFROMPOINT(&H1A9=425)获取光标所在的列表项的索引

LB_SETHORIZONTALEXTENT(&H194=404),长度,0设置列表框的横向滚动条以及滚动长度,长度为象素值

组合框操作:

CB_SHOWDROPDOWN(&H14F),1(0),0打开(关闭)组合框的列表

TVM_SETBKCOLOR(&H1100+29=4381)设置扩展树型列表控件的背景色(TVM开头的常数)

常用窗口消息:

WM_GETFONT(&H31=49)得到当前控件绘制文本的字体(的句柄)

WM_GETTEXT(&HD=13),变量长度,变量取得窗体的标题,变量须预先赋空字串(chr(0)),变量长度=Len(变量)

WM_SETTEXT(&HC=12),0,ByVal"字串"设置窗体的标题

WM_NCLBUTTONDOWN(&HA1=161),2,0在非客户区,即边框及标题栏上(假如定义的是一个组件,则非客户区包括Form等)按下鼠标左键;

WM_LBUTTONDOWN(&H201=513),2,0在客户区,也就是除边框及标题栏以外按下鼠标左键

WM_VSCROLL(&H115=277),&H10000*p+SB_THUMBPOSITION(&H4),0同步滚动文本,p是位置改变量

WM_PAINT

WM_USER(&H400=1024)

WM_CUT(&H300=768),0,0剪切

WM_COPY(&H301=769)),0,0复制

WM_PASTE(&H302=770)),0,0粘贴

WM_CLEAR(&H303=771)),0,0删除

WM_UNDO(&H304=772)),0,0撤消

按纽消息:

BM_SETSTYLE(&HF4)设置按纽样式

BS_RADIOBUTTON(&H4)收音机旋纽式的按纽,是BM_SETSTYLE使用的参数

SendMessage函数应用

(一)

在Windows系统的很多消息中,有一些不仅仅是提供一个窗口消息那么简单。

它们可以控制窗口的

动作和属性。

下面向大家介绍SendMessage函数在扩充列表(ListBox)控件功能方面的应用。

  在Windows中,有一系列的以LB_开头的列表消息,这里介绍的就是利用LB消息控制的ListBox

的应用

1使列表中光标移动到不同的列表项上有不同的提示(ToolTip)

  在列表框控件中有一个ToolTipText属性,该属性决定了当光标在列表框上移动时出现的提示文

字。

但是如何使得当光标在不同的列表项上移动时的提示文字也不同呢问题的关键是要知道在光标移

动时光标所在的列表项的索引,使用SendMessage函数发送LB_ITEMFROMPOINT消息就可以获得。

  在Form1中加入一个ListBox控件,运行程序,当光标在列表中移动时,可以看到根据光标所在

的不同的列表项,提示文字也不相同。

代码如下(我已试验成功):

ConstLB_ITEMFROMPOINT=&H1A9

PrivateSubForm_Load()

DimZXSAsLong

="G:

":

="G:

\一江秋水的文档"

=(0)

ZXS=SendMessage,186,0,0)

="共"&ZXS&"行,"&Len&"字"

Fori=1To200:

str(i)+"列表框试验项目":

Next

EndSub

PrivateSubList1_MouseMove(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)

DimlXPointAsLong,lYPointAsLong,lIndexAsLong

IfButton=0Then'确定在移动鼠标的同时没有按下功能键或者鼠标键

lXPoint=CLng(x/'获得光标的位置,以像素为单位

lYPoint=CLng(y/

WithList1

lIndex=SendMessage(.hwnd,LB_ITEMFROMPOINT,0,ByVal((lYPoint*65536)+lXPoint))'获得光标所在的标题行的索引

IflIndex<.ListCountThen.TooltipText=.List(lIndex)Else.TooltipText=""

EndWith

EndIf

EndSub

2向列表中加入横向滚动条使得可以浏览长列表项

当向列表中加入的列表项超出了列表的显示范围后,列表并不会出现横向滚动条让你可以通过滚动来浏览

项目的全部内容。

利用LB_SETHORIZONTALEXTENT消息可以设置列表框的横向滚动条以及滚动长度。

  在Form1中加入一个ListBox控件,运行程序,可以看到列表中出现了横向滚动条,而且滚动范围正好

是列表项的长度代码如下(我已试验成功):

OptionExplicit

PrivateTypeRECT

LeftAsLong

TopAsLong

RightAsLong

bottomAsLong

EndType

PrivateDeclareFunctionDrawTextLib"user32"Alias"DrawTextA"(ByValhDCAsLong,_

ByVallpStrAsString,ByValnCountAsLong,lpRectAsRECT,ByValwFormatAsLong)AsLong

PrivateDeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByValhwndAsLong,_

ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong

ConstLB_SETHORIZONTALEXTENT=&H194

ConstDT_CALCRECT=&H400

PublicFunctionListTextWidth(ByReflstThisAsListBox)AsLong'获取最长项目的象素长度值

DimiAsLong

DimtRAsRECT

DimlWAsLong

DimlWidthAsLong

DimlHDCAsLong

With====With

lHDC=i=0To-1'遍历所有的列表项以找到最长的项

DrawTextlHDC,(i),-1,tR,DT_CALCRECT

lW=-+8

IflW>lWidthThenlWidth=lW

Next

ListTextWidth=lWidth'返回最长列表项的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1