使用delphi的消息机制可以方便操作后台,其中重要的就是sendmessage()函数。下面讲解一下这个函数
- function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
其中四个参数的含义和说明如下:
1.hWnd:
对象的句柄。希望将消息传送给哪个对象,就把该对象的句柄作为实参传送,在 VB 中可以简单地
用“对象.hWnd”获得某个对象的句柄,如 Text1.hWnd和 Form1.hWnd分别可以得到 Text1和Form1的句
柄。它是一个长整型数。Windows给每个控件一个编号,这个编号就称为窗口句柄。有了这个句柄,我们
就可告诉 Windows 我们要控制哪个控件,所以这个句柄在 API 调用中至关重要。VB 的大多数控件都包
括hwnd属性,如下拉框、TreeView等,窗体也有这个属性。但也有一些控件没有这个属性,如标签控件。
没有这个属性就无法利用Windows API函数,但可以节省系统资源。
2.wMsg:
被发送的消息。根据具体需求和不同的对象,将不同的消息作为实参传送,以产生预期的动作。使
SendMessage 传递消息,大多是为了完成以下几个工作:
①设置控件的一些选项,象我们要使用的CB_SETDROPPEDWIDTH的就属于这种情况。尽管VB的每个控
件都提供了许多属性,但仍然有许多控件的选项没有包括在其中。而这些选项中的大多数都可以利用该
函数进行设置?
②获得控件的一些设置。同上一种情况相反,有时我们需要获得控件的一些设置,相当于读取属性。
例如,如果想知道一个下拉框的下拉部分的宽度是多少,就可以向控件发送CB_GETDROPPEDWIDTH消息。
对于这种情况,SendMessage函数的返回值就是结果。
③执行一定的操作。例如,我们要在下拉框中寻找是否有“ABC”这个字符串,当然,我们可以编写
一个循环,逐条比较看是否存在这样的字符串。如果使用API,我们只需要向下拉框发送CB_FINDSTRING
消息,这条消息就会自动进行查找工作并返回结果。
④模拟用户操作。我们有时希望模拟用户的操作,比如关闭其他应用程序的窗口。其实只要我们能知
道那个窗口的句柄,我们就可以发送WM_CLOSE消息给那个窗口,窗口接受到这条消息就会关闭,如同用户
关闭窗口一样?
3.wParam、4.lParam:
附加的消息信息。这两个是可选的参数,用来提供关于wMsg消息更多的信息,不同的wMsg可能使用这
两个参数中的0、1或2个,如果不需要哪个附加参数,则将实参赋为NULL(在VB中赋为0)。
lParam定义为Any类型。指定 Any类型可禁止VB进行类型检查,从而允许将任意数据类型传递给该过
程。由于每条消息对参数的类型和传递方式的要求都不同:有的可能要求为Long型,有的可能要求为自定
义类型;大多数要求按传值方式传递,但也有一些要求按传地址方式。为了满足各种要求,我们将这个参
数定义为Any类型。比如,我们要传递一个Long型变量lData。如果消息要求传地址方式传递,可以使用:
SendMessage ……, lData
而如果要求传值方式传递,则使用
SendMessage ……, ByVal lData
如果传递常数,我们则需要使用类型后缀来指定常数的类型,比如"0&",表示Long型的常数0,如
SendMessage ……, ByVal 0&
我们也可以使用类型转换函数CLng将常数指定为Long型,如CLng(0)。
程序中,有时定义 lParam As Any,有时定义 ByVal lParam As String。这是为什么呢?对于
SendMessage函数,lParam的使用是很灵活的,在一般情况下,lParam是一个指针,它指向的数据类型
有三种:长整形、自定义数据结构类型、字符串类型。对于前两种类型,需要将 lParam定义为 lParam
As Any,从而将 lParam 数据的指针传递到 SendMessage 函数。对于字符串类型,则需要定义 Byval
lParam As String,因为字符串类型数据不同,只有定义 ByVal,得到的才是字符串的指针,如果没有
ByVal,得到的将是指向字符串指针的指针。另外对于少数的消息来说,SendMessage 函数需要的只是
lParam 本身的值,这时就需要将 lParam定义为 Byval lParam As Long,或者在程序调用时在 lParam
之前加 ByVal?
当用户在编辑控件上进行各种操作时,其父窗口将收到 WM_COMMAND 通知消息,lParam带控件句柄
(hWnd),同时 wParam 的低16位带控件的 ID,高16位带有如下表的消息代码.
常用编辑控件消息:
- EC_LEFTMARGIN(&H1) EC_USEFONTINF
- EC_RIGHTMARGIN EC_USEFONTINF
- EC_USEFONTINF,O
- EM_CHARFROMPOS(&HD7=215),0,
- EM_CANUNDO(&HC6=198),0,0
- EM_EMPTYUNDOBUFFER(&HCD=205 ),0,0
- EM_FMTLINES(&HC8=200)
- EM_GETFIRSTVISIBLEINE(&HCE=206),0,0
- EM_GETLINE(&HC4=196 )
- EM_GETLINECOUNT(&HBA=186,0,0
- EM_GETMODIFY(&HB8=184),0,0
- EM_GETPASSWORDCHAR( ),0,0
- EM_GETRECT(&HB2=178),0,结构
- EM_GETTHUMB(&HBE=190),0,0
- EM_GETSEL(&HB0=176),0,
- EM_GETHANDLE(&HBD=189),0,0
- EM_GETWORDBREAKPROC(&HD1=209),0,0
- EM_GETLIMITTEXT(WM_USER+37=1061),0,0
- EM_GETMARGINS( ),0,0
- EM_LIMITTEXT(&HC5=197),
- EM_SCROLLCARET(&HB7=183),0,0
- EM_LINEFROMCHAR(&HC9=201),
- EM_LINEINDEX(&HBB=187),
- EM_LINELENGTH(&hC1=193)
- EM_POSFROMCHARPOINT,结构地址,偏移值 取得指定字符位置的行列号,偏移值是字符相对于文本头部的偏移。
- EM_LINESCROLL(&HB6=182)
- EM_EXGETSEL (&H434 = 1076)
- EM_EXSETSEL(&H437=1079),0
- EM_PASTESPECIAL(&H440=1088),2(1),1
- EM_FINDTEXT(&H738=1080)
- EM_FINDTEXTEX(&H44F=1103)
- EM_SETTEXTEX(&H461=1121)
- EM_SETTARGETDEVICE, GetDC(RichText.hWnd), RichText.Width
- EM_SETTARGETDEVICE, 0, 1
- EM_POSFROMCHAR(&HD6或&H426)
- EM_SCROLL(&HB5=181),*,0
- EM_REPLACESEL(&HC2=194),1(0)
- EM_SETSEL(&HB1=177)
- EM_UNDO(&HC7=199),0,0
- EM_SETCHARFORMAT(&H444)
- EM_SETHANDLE(&HBC=188),
- EM_SETLIMITTEXT,长度(字节),0
- EM_SETMARGINS(&HD3=211)
- EM_SETMODIFY(&HB9=185),1(0),0
- EM_SETPASSWORDCHAR(&HCC=204),
- EM_SETREADONLY(&HCF=207),1(0),0
- EM_SETRECT(&HB3=179),0(或RECT),
- EM_SETRECTNP(&HB4=180),0(或RECT)
- EN_CHANGE(&H300=768)
- 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_MAXTEXT(&H501=1281)
- 编辑风格消息:
- ES_MULTILINE
- ES_LEFT
- ES_CENTER
- ES_RIGHT
- ES_LOWERCASE
- ES_UPPERCASE
- ES_OEMCONVERT
- 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
- LB_ITEMFROMPOINT(&H1A9=425)
- LB_SETHORIZONTALEXTENT(&H194=404),
- 组合框操作:
- CB_SHOWDROPDOWN(&H14F),1(0),0
- TVM_SETBKCOLOR(&H1100+29=4381)
- 常用窗口消息:
- WM_GETFONT(&H31=49)
- WM_GETTEXT(&HD=13),
- WM_SETTEXT(&HC=12),0,ByVal
- WM_NCLBUTTONDOWN(&HA1=161),2,0
- WM_LBUTTONDOWN(&H201=513),2,0
- WM_VSCROLL(&H115=277),&H10000*p+SB_THUMBPOSITION(&H4),0
- 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)
例如对windows发消息让文本选中。
- SendMessage(Text1.hwnd,EM_GETSEL,0,-1 );
文本全全选。
http://blog.csdn.net/sushengmiyan/article/details/7836500
windows的消息传递--消息盒子
原文:http://www.cnblogs.com/findumars/p/5183707.html