VBSendMessage函数参数详解docxWord文档格式.docx
《VBSendMessage函数参数详解docxWord文档格式.docx》由会员分享,可在线阅读,更多相关《VBSendMessage函数参数详解docxWord文档格式.docx(55页珍藏版)》请在冰点文库上搜索。
4模拟用户操作。
我们冇时希望模拟用户的操作,比如关闭其他应用程序的窗口。
其实只耍我们能知道那个窗口的句柄,我们就可以发送WM.CLOSE消息给那个窗口,窗口接受到这条消息就会关闭,如同用户关闭窗口一样
3.wParam>
4」Param:
附加的消息信息。
这两个是可选的参数,用來捉供关于wMsg消息更多的信息,不同的wMsg可能使用这两个参数中的0、1或2个,如果不需要哪个附加参数,则将实参赋为NULL(在VB中赋为0)。
IParam定义为Any类型。
指定Any类型可禁止VB进行类型检査,从而允许将任意数据类型传递给该过程。
由于每条消息対参数的类型和传递方式的要求都不同:
有的可能要求为Long型,有的可能要求为自定义类型;
大多数要求按传值方式传递,但也有一些要求按传地址方式。
为了满足各种要求,我们将这个参数定义为Any类型。
比如,我们要传递一个Long型变量IData。
如果消息要求传地址方式传递,可以使用:
SendMessage,IData
而如果要求传值方式传递,则使用
SendMessage,ByVaiIData
如果传递常数,我们则需要使用类型后缀来指定常数的类型,比如”0&
爲表示Long型的常数0,如SendMessageByVai0&
我们也可以使用类型转换函数CLng将常数指定为Long型,如CLng(O)。
程序中,有时定义IParamAsAny,有时定义ByVaiIParamAsString.,这是为什么呢对于
SendMessage函数,IParam的使用是很灵活的,在一般情况下,IParam是一个指针,它指向的数据类型有三种:
长整形、口定义数据结构类型、字符串类型。
对于前两种类型,需要将IParam定义为IParamAsAny,从而将IParam数据的指针传递到SendMessage函数。
对于字符串类型,则需要定义ByvalIParamAsString,因为字符串类型数据不同,只有定义ByVai,得到的才是字符串的指针,如果没有ByVai,得到的将是指向字符串指针的指针。
另外对于少数的消息來说,SendMessage函数需要的只是IParam本身的值,这时就需要将IParam定义为ByvalIParamAsLong,或者在程序调用时在IParam之前加ByVai
当用户在编辑控件上进行各种操作时,共父窗口将收到WM_COMMAND通知消息,IParam带控件句柄
(hWnd),同时wParam的低16位带控件的ID,高16位带有如下表的消息代码:
常用编辑控件消息:
EC_LEFTMARGIN(&
H1)EC_USEFONTINF设置左边距时使用
EC_RIGHTMARGINEC_USEFONTINF设置右边距时使用
EC_USEFONTINF,O,边距设置编辑控件的左、右边距,当wParam含EC_LEFTMARGIN时在IParam的低16位指定左边距点数,当wParam含EC_RIGHTMARGIN时在IParam的高16位指定右边距点数。
当指定wParam为EC_USEFONTINFO吋,则用当前字体的字符“A“的宽度指定右边距和字符“C”的宽度指定左边距IParam被忽略。
EM_CHARFROMPOS(&
HD7=215)A取得编辑控件屮指定位置的字符相对于文本头部的偏移量。
使川本操作应先在第4个参数的高16位指定行号,低16位指定列号(或一个POINTAPI结构),行列是按编辑控件的客户区左上角为原点(0,0)计算的。
如果指定的位置超出控件客户区则返冋・1
EM_CANUNDO(&
HC6=198)A0决定前一次编辑操作是否能够撤消:
检测控件撤消缓冲区是否为空,通常控件把故后一次在控件的编辑操作保存在一个撤消缓冲区,如果缓冲区非空则返回TRUE表示上次操作可以撤消,否则返回FALSE,应用程序可以利用该返回值來禁止或允许菜单或工具条的“撤消“项。
EM_EMPTYUNDOBUFFER(&
HCD=205),0,0消除控件的撤消缓冲区,使其不能撤消前-次编辑操作EM_FMTLINES(&
HC8=200)决定是否在取冋的文本宇串中包含软冋车字符
EM_GETFIRSTVISIBLEINE(&
HCE=206),0z0获得文木控件中处f■可见位置的最顶部的文木所在的行号EM_GETLINE(&
HC4=196),行号,ByVai变量获取编辑控件某一行的内容,变量须预先赋空格EM_GETLINECOUNT(&
HBA=186,0/0获取编辑控件的总行数
EM_GETMODIFY(&
HB8=184)zO,0判断编辑控件的内容是否己发生变化,返回TRUE则控件文本己被修改,返冋FALSE则未变。
EM_GETPASSWORDCHAR(),0,0获取编辑控件的密码字符,返回NULL表示没有字符EM_GETRECT(&
HB2=178),0,结构获取编辑控件的格式化矩形
EM_GETTHUMB(&
HBE=190)A0取得多行文木编辑控件的滚动框的当前位置(注惫:
是象素值)EM_GETSEL(&
HB0=176)/0,变屋获取光标位置(以字节数表示),或:
(缓冲区起点,缓冲区终点)取得编辑控件中选定内容的范围,返回值中低16位为起点,高16位为终点
EM_GETHANDLE(&
HBD=189),0,0取得文木缓冲区
EM_GETWORDBREAKPROC(&
HD1=209)Z0,0取得整字换行回调两数EditWordBreakProc指针EM_GETLIMITTEXT(WM_USER+37=1061),0/0获取一个编辑控件屮文本的最大长度
EM_GETMARGINS(),0,0获取编辑控件的左、右边距,返回值低16位为左边距,高16位为右边距(不得用于NT3.51)
EM_LMTTEXT(&
HC5“97),最大值,0设置编辑控件中的文木长度
EM_SCROLLCARET(&
HB7=183),0,0把可见范用移至光标处
EM_LINEFROMCHAR(&
HC9=201)Z偏移值,0获取指定位置(或:
-1,0表示光标位置)所在的行号EM_LINEINDEX(&
HBB=187L行号,0获取指定行(或:
-1,0表示光标所在行)首字符在文木中的位置(以字节数表示)
EM_UNELENGTH(&
hCl=193),偏移值,0获取指定位置所在行(或"
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(l),lRichEdit控件粘贴剪贴板中的位图(或文本)EM_FINDTEXT(&
H738=1080)RichEdit控件正文搜索操作
EM_FINDTEXTEX(&
H44F=1103)同上
EM_SETTEXTEX(&
H461=1121)RichEdit控件正文替换/插入操作
EM_SETTARGETDEVICE,GetDC(RichText.hWnd),RichText.Width/15)设置RichTextBox口动换行,后续代码是:
RichText.RightMargin=iif(RichText.RightMargin=0,1,0)
EM_SETTARGETDEVICE,0,1设置RichTextBox不自动换行
EM_POSFROMCHAR(&
HD6或&
H426)判断指定字符在编辑控件的位置(用于NT3.51)EM_SCROLL(&
HB5=181),*,0文本垂直滚动。
第三个参数*控制滚动方向:
SB_LINEDOWN
(1)向下滚动一行,SB_UNEUP(0)向上滚动一行,SB_PAGEDOWN⑶向下滚动一页,SB_PAGEUP⑵向上滚动一页。
EM_REPLACESEL(&
HC2=194),l(0)z字符串用指定字符串替换编辑控件中的当前选定内容,如果第三个参数wParam为1,则本次操作允许撤消,0禁止撤消。
字符审可用传值方式,也可用传址方式(例:
SendMessageTextl.hwnd,EM_REPLACESEL,0,Text2.Text'
这是传值方式)
EM_SETSEL(&
HB1=177),起点,终点设置编辑控件屮文本选定内容范围(或设置光标位置),该范囤被反相显示,用于为复制、替换、粘贴、剪切、删除等编辑功能指定范围,光标将被移至指定的终点后面。
还可使用指定相同起点和终点来移动光标而不是选定范围。
当指定的起点等于0和终点等于・1时,文本全部被选中,此法常用在清空编辑控件。
当指定的起点等于・2和终点等于时,全文均不选,光标移至文本未端,此法常用在文本未端追加内容。
注意:
当控件没有输入焦点时,本操作将会失败,一般在执行本操作前都应调用SetFocus先取得输入焦点。
EM_UNDO(&
HC7J99),0,0撤消前一次编辑操作,当重复发送木消息,控件将在撤消和恢复中來回切换EM_SETCHARFORMAT(&
H444)改变选定文本的颜色
EM_SETHANDLE(&
HBO188),缓冲区指针,0为编辑控件指定新的文木缓冲区。
此操作仅适用对话框创建带DS_LOCALEDIT风格的控件。
EM_SETLIMITTEXT,t<度(字节),0设置编辑控件屮的文本最大长度(不得用于NT3.51)EM_SETMARGINS(&
HD3=211)设置编辑控件的左、右边距(不得用于NT3.51)EM_SETMODIFY(&
HB9=185)4(OLO设置或淸除-■个编辑控件的修改标志EM_SETPASSWORDCHAR(&
HCC=204)Z字符,0指定控件用來显示密码的字符,缺省为”初。
当第三个参数wParam为0时,本操作将清除控件的ES_PASSWORD风格,并按实际字符显示。
EM_SETREADONLY(&
HCF=207),1(0)/0决定是否将编辑控件设为只读,同时决定控件的ES_READONLY风格EM_SETRECT(&
HB3=179)/0(或RECT),结构地址为一个编辑控件设置格式化矩形
EM_SETRECTNP(&
HB4=180)z0(或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通知消息相似,只是它发生于更新文本显示出来Z前。
EN_MAXTEXT(&
H501=1281)用户输人的文字数超出由EM_LIMITTEXT消息规定的界限,或超出由VBMaxlength属性规定的界限,就会发送这条消息。
此外,倘若不允许口动进行水平滚动,同时插入点要超出控件的宽度;
或者不允许自动垂直滚动,同时插入点要超出控件的高度,那么也会触发这条消息。
在没有ES_AUTOHSCROLL或ES_AUTOVSCROLL的编辑框中,当正文超出了编辑框的边框吋也会发出该消息。
编辑风格消息:
ES_MULTILINE指定编辑控件能否进行多行文本编辑,若多行编辑器不指定ES_AUTOHSCROLL风格,则会口动换行,用户每按一次Enter,在当前光标处输入一个回车换行符(ODh,OAh),文木增加一行。
若不指定ES_AUTOVSCROLL,则多行编辑器会在窗口中正文装满时发出警告声响。
ES_LEFT文木显示居左
ES_CENTER文本显示居中
ES_RIGHT文本显示居右
ES_LOWERCASE把用户输入的字母统统转换成小写字母
ES_UPPERCASE把用户输入的字母统统转换成人写字母
ES_OEMCONVERT把输入的文本从ANSI码转换成OEM码,然后乂转换成ANSI码,H的是保证函数AnsiToOem的正确调用。
这在编辑框屮包含文件名时是很有用的。
ES_AUTOHSCROLL(自动增加水平滚动条)当用户在行尾键入一个字符时,正文将自动向右滚动10个字符,当用户按回车键时,正文总是滚向左边。
ES_AUTOVSCROLL当用户在最后一个可见行按回车键时,正文向上滚动一页。
ES_NUMBER只接收数码输入,其它字符输入-•律无效。
ES_NOHIDESEL(&
H100=256)当编辑框失去输入焦点时,选中的文本将隐藏,正文中的选择保持不变。
缺省时正文中的选择将失效,当获得输入焦点后才又显示出來。
ES_READONLY将编辑框设胃•成只读的
ES_PASSWORD(&
H20=32)使所有键入的字符都用”和来显示。
ES_WANTRETURN使多行编辑器接收回车键输入并换彳亍。
如果不指定该风格,按冋乍键会选择缺省的命令按钮,这往往会导致对话框的关闭。
列表框操作:
LB_FINDSTRING(&
H18F=399),-l/ByVal字串査找列表项的字符串,返回值=字符串所在的列表项的索引。
J表示从第0行开始查找,如果改为一个有效的列表项索引值,将从该行开始查找。
LB_ITEMFROMPOINT(&
H1A9=425)获取光标所在的列表项的索引LB_SETHORIZONTALEXTENT(&
H194=404),长度,0设置列表框的横向滚动条以及滚动长度,长度为象索值组合框操作:
CB_SHOWDROPDOWN(&
H14F),1(0),0打开(关闭)组合框的列表
TVM_SETBKCOLOR(&
HHOO+29=4381)设置扩展树型列表控件的背景色(TVM开头的常数)
常用窗口消息:
WM_GETFONT(&
H31=49)得到当前控件绘制文本的字体(的句柄)
WM_GETTEXT(&
HD=13)Z变量长度,变量取得窗体的标题,变量须预先赋空字串(chr(O)),变量氏度二Len(变量)WM_SETTEXT(&
HC=12),0?
ByValH字串”设置窗体的标题
WM_NCLBUTTONDOWN(&
HAl=161)/2/0在非客户区,即边框及标题栏上(假如定义的是一个组件,则非客户区包fSForm等)按下鼠标左键;
WM_LBUTTONDOWN(&
H201=513)Z2,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))A0复制
WM_PASTE(&
H302=770)),0z0粘贴
WM_CLEAR(&
H303=771))z0,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函数发送LBJTEMFROMPOINT消息就可以获得。
在Forml中加入一个ListBox控件,运行程序,当光标在列表中移动时,可以看到根据光标所在的不同的列表项,提示文字也不相同。
代码如下(我己试验成功):
ConstLB_ITEMFROMPOINT=&
H1A9
PrivateSubForm_Load()
DimZXSAsLong
Drivel.Drive="
G:
"
:
Dirl.Path=”G:
\—江秋水的文档”
Combol.Text=Combol.List(O)
ZXS=SendMessage(Textl.hwnd」86,0,0)
Labell.Caption="
共“&
ZXS&
”行,"
&
Len(Text1.Text)&
字”
Fori=1To200:
Listl.Additemstr(i)+n列表框试验项U"
Next
EndSub
PrivateSubListl_MouseMove(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
DimIXPointAsLong,lYPointAsLong,llndexAsLong
IfButton=0Then,确定在移动鼠标的同时没有按卞功能键或者鼠标键
IXPoint=CLng(x/Screen.TwipsPerPixelX)'
获得光标的位置,以像素为单位
lYPoint=CLngfy/Screen.TwipsPerPixelY)
WithListl
llndex=SendMessage(.hwnd,LB」TEMFROMPOINT,0,ByVai((lYPoint*65536)+IXPoint))1获得光标所在的标题行的索引
Ifllndex<
丄istCountThen.TooltipText=.List(llndex)Else.TooltipText=,M,
EndWith
EndIf
2向列表中加入横向滚动条使得可以浏览长列表项
当向列表中加入的列表项超出了列表的显示范围后,列衣并不会出现横向滚动条让你可以通过滚动来浏览
项H的全部内容。
利用LB_SETHORIZONTALEXTENT消息可以设置列表框的横向滚动条以及滚动长度。
在Forml中加入一个ListBox控件,运行程序,可以看到列表中出现了横向滚动条,而且滚动范围正好
是列表项的长度代码如下(我己试验成功):
OptionExplicit
PrivateTypeRECT
LeftAsLong
TopAsLong
RightAsLong
bottomAsLong
EndType
PrivateDeclareFunctionDrawTextLib"
Alias"
DrawTextA11(ByVaihDCAsLong,_
ByVaiIpStrAsString,ByVainCountAsLong,IpRectAsRECT,ByVaiwFormatAsLong)AsLong
PrivateDeclareFunctionSendMessageLib"
user32HAlias'
'
SendMessageA11(ByVaihwndAsLong,_
ByVaiwMsgAsLong,ByVaiwParamAsLong,IParamAsAny)AsLong
ConstLB_SETHORIZONTALEXTENT=&
H194
ConstDTJZALCRECT=&
H400
PublicFunctionListTextWidth(ByRefIstThisAsListBox)AsLong'
获取最上项U的象素上度值
DimiAsLong
DimtRAsRECT
DimIWAsLong
DimIWidthAsLong
DimIHDCAsLong
WithIstThis.Parent.Font
.