该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而和函数PostMessage不同,PostMessage是将一个消息寄送到一个线程的消息队列后就立即返回。
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam)
hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
Msg:指定被发送的消息。
wParam:指定附加的消息特定信息。
IParam:指定附加的消息特定信息。
返回值:返回值指定消息处理的结果,依赖于所发送的消息。
备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消息。
如果指定的窗口是由正在调用的线程创建的,则窗口程序立即作为子程序调用。如果指定的窗口是由不同线程创建的,则系统切换到该线程并调用恰当的窗口程序。线程间的消息只有在线程执行消息检索代码时才被处理。发送线程被阻塞直到接收线程处理完消息为止。
WindowsCE:WindowsCE不支持Windows桌面平台支持的所有消息。使用SendMesssge之前,要检查发送的消息是否被支持。
速查:WindowsNT:3.1及以上版本:Windows:95及以上版本;WindowsCE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib;Unicode:在WindowsNT环境下以Unicode和ANSI方式实现。
SendMessage函数使用实例
程序控制拉下或收起组合框的下拉列来。
一般情况下,为了拉下或收起组合框的下拉列表,需要用键盘或鼠标进行操作,而有时我们希望程序运行的某个时刻自动拉出下拉列表(比如在一些演示程序中),为了实现这个目的,我们也只有借助于SendMessage函数,方法是发一个CB_SHOWDROPDOWN(&H14F)消息给组合框。
在发CB_SHOWDROPDOWN消息时,wParam参数决定了是拉下列表(=True时)还是收起列表(=False时),lParam无用(设为0)。
-------------C#-------------
一、API
命名空间
usingSystem.Runtime.InteropServices;
函数原型
[DllImport("user32.dll",EntryPoint="SendMessage")]
staticexternIntPtrSendMessage(IntPtrhWnd,uintMsg,intwParam,stringlParam);
二、CLT
命名空间
Microsoft.WindowsCE.Forms
函数语法
publicstaticvoidSendMessage(refMessagem)
用法示例
Messagemsg=Message.Create(MsgWin.Hwnd,
MsgWindow.WM_CUSTOMMSG,
(IntPtr)e.X,
(IntPtr)e.Y);
MessageWindow.SendMessage(refmsg);
-------------VB-------------
PrivateDeclareFunctionSendMessageLib"user32"Alias_
"SendMessageA"(ByValhwndAsLong,ByValwMsgAsLong,ByVal_
wParamAsLong,lParamAsAny)AsLong
PrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"_
(ByVallpClassNameAsString,_
ByVallpWindowNameAsString_
)AsLong
PrivateConstWM_close=16
PrivateSubCommand1_Click()
DimwinHwndAsLong
DimlngRetValAsLong
winHwnd=FindWindow("IEFrame",vbNullString)
Debug.PrintwinHwnd
IfwinHwnd<>0Then
RetVal=SendMessage(winHwnd,WM_close,0&,0&)
Else
MsgBox"IE没有运行。"
EndIf
EndSub
-------------C++-----------------
#include"windows.h"
intmain(intargc,char*argv[])
{
HWNDhWnd=::FindWindow(NULL,"QQ2010");
if(hWnd!=NULL)
{
::SendMessage(hWnd,WM_CLOSE,0,0);
}
return0;
}
为说明具体的使用方法,下面提供简单的程序片段。首先在代码模块中做如下声明:
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
Thefollowingaretherangesofmessagenumbers.
RangeMeaning
0throughWM_USER–1Messagesreservedforusebythesystem.
WM_USERthrough0x7FFFIntegermessagesforusebyprivatewindowclasses.
WM_APPthrough0xBFFFMessagesavailableforusebyapplications.
0xC000through0xFFFFStringmessagesforusebyapplications.
Greaterthan0xFFFFReservedbythesystem.
Messagenumbersinthefirstrange(0throughWM_USER–1)aredefinedbythesystem.Valuesinthisrangethatarenotexplicitlydefinedarereservedbythesystem.
Messagenumbersinthesecondrange(WM_USERthrough0x7FFF)canbedefinedandusedbyanapplicationtosendmessageswithinaprivatewindowclass.Thesevaluescannotbeusedtodefinemessagesthataremeaningfulthroughoutanapplication,becausesomepredefinedwindowclassesalreadydefinevaluesinthisrange.Forexample,predefinedcontrolclassessuchasBUTTON,EDIT,LISTBOX,andCOMBOBOXmayusethesevalues.Messagesinthisrangeshouldnotbesenttootherapplicationsunlesstheapplicationshavebeendesignedtoexchangemessagesandtoattachthesamemeaningtothemessagenumbers.
Messagenumbersinthethirdrange(0x8000through0xBFFF)areavailableforapplicationtouseasprivatemessages.Messageinthisrangedonotconflictwithsystemmessages.
Messagenumbersinthefourthrange(0xC000through0xFFFF)aredefinedatruntimewhenanapplicationcallstheRegisterWindowMessagefunctiontoretrieveamessagenumberforastring.Allapplicationsthatregisterthesamestringcanusetheassociatedmessagenumberforexchangingmessages.Theactualmessagenumber,however,isnotaconstantandcannotbeassumedtobethesamebetweendifferentsessions.
Messagenumbersinthefifthrange(greaterthan0xFFFF)arereservedbythesystem.
#defineWM_NULL0x0000
#defineWM_CREATE0x0001//创建一个窗口
#defineWM_DESTROY0x0002//当一个窗口被破坏时发送
#defineWM_MOVE0x0003//移动一个窗口
#defineWM_SIZE0x0005//改变一个窗口的大小
#defineWM_ACTIVATE0x0006//一个窗口被激活或失去激活状态
/*
*WM_ACTIVATEstatevalues
*/
#defineWA_INACTIVE0
#defineWA_ACTIVE1
#defineWA_CLICKACTIVE2
#defineWM_SETFOCUS0x0007//一个窗口获得焦点
#defineWM_KILLFOCUS0x0008//一个窗口失去焦点
#defineWM_ENABLE0x000A//一个窗口改变成Enable状态
#defineWM_SETREDRAW0x000B//设置窗口是否能重画
#defineWM_SETTEXT0x000C//应用程序发送此消息来设置一个窗口的文本
#defineWM_GETTEXT0x000D//应用程序发送此消息来复制对应窗口的文本到缓冲区
#defineWM_GETTEXTLENGTH0x000E//得到与一个窗口有关的文本的长度(不包含空字符)
#defineWM_PAINT0x000F//要求一个窗口重画自己
#defineWM_CLOSE0x0010//当一个窗口或应用程序要关闭时发送一个信号
#ifndef_WIN32_WCE
#defineWM_QUERYENDSESSION0x0011//当用户选择结束对话框或程序自己调用ExitWindows函数
#defineWM_QUERYOPEN0x0013//当用户窗口恢复以前的大小位置时,把此消息发送给某个图标
#defineWM_ENDSESSION0x0016//当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序,通知它对话是否结束
#endif
#defineWM_QUIT0x0012//用来结束程序运行
#defineWM_ERASEBKGND0x0014//当窗口背景必须被擦除时(例在窗口改变大小时)
#defineWM_SYSCOLORCHANGE0x0015//当系统颜色改变时,发送此消息给所有顶级窗口
#defineWM_SHOWWINDOW0x0018//当隐藏或显示窗口是发送此消息给这个窗口
#defineWM_WININICHANGE0x001A
#if(WINVER>=0x0400)
#defineWM_SETTINGCHANGEWM_WININICHANGE
#endif/*WINVER>=0x0400*/
#defineWM_DEVMODECHANGE0x001B
#defineWM_ACTIVATEAPP0x001C//发此消息给应用程序哪个窗口是激活的,哪个是非激活的
#defineWM_FONTCHANGE0x001D//当系统的字体资源库变化时发送此消息给所有顶级窗口
#defineWM_TIMECHANGE0x001E//当系统的时间变化时发送此消息给所有顶级窗口
#defineWM_CANCELMODE0x001F//发送此消息来取消某种正在进行的摸态(操作)
#defineWM_SETCURSOR0x0020//如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口
#defineWM_MOUSEACTIVATE0x0021//当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口
#defineWM_CHILDACTIVATE0x0022//发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小
#defineWM_QUEUESYNC0x0023//此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的hook程序分离出用户输入消息
#defineWM_GETMINMAXINFO0x0024//此消息发送给窗口当它将要改变大小或位置
/*
*StructpointedtobyWM_GETMINMAXINFOlParam
*/
typedefstructtagMINMAXINFO{
POINTptReserved;
POINTptMaxSize;
POINTptMaxPosition;
POINTptMinTrackSize;
POINTptMaxTrackSize;
}MINMAXINFO,*PMINMAXINFO,*LPMINMAXINFO;
#defineWM_PAINTICON0x0026//发送给最小化窗口当它图标将要被重画
#defineWM_ICONERASEBKGND0x0027//此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画
#defineWM_NEXTDLGCTL0x0028//发送此消息给一个对话框程序去更改焦点位置
#defineWM_SPOOLERSTATUS0x002A//每当打印管理列队增加或减少一条作业时发出此消息
#defineWM_DRAWITEM0x002B//当button,combobox,listbox,menu的可视外观改变时发送
#defineWM_MEASUREITEM0x002C//当button,combobox,listbox,listviewcontrol,ormenuitem被创建时
#defineWM_DELETEITEM0x002D
#defineWM_VKEYTOITEM0x002E//此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息
#defineWM_CHARTOITEM0x002F//此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息
#defineWM_SETFONT0x0030//当绘制文本时程序发送此消息得到控件要用的颜色
#defineWM_GETFONT0x0031//应用程序发送此消息得到当前控件绘制文本的字体
#defineWM_SETHOTKEY0x0032//应用程序发送此消息让一个窗口与一个热键相关连
#defineWM_GETHOTKEY0x0033//应用程序发送此消息来判断热键与某个窗口是否有关联
#defineWM_QUERYDRAGICON0x0037//此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标
#defineWM_COMPAREITEM0x0039//发送此消息来判定combobox或listbox新增加的项的相对位置
#if(WINVER>=0x0500)
#ifndef_WIN32_WCE
#defineWM_GETOBJECT0x003D
#endif
#endif/*WINVER>=0x0500*/
#defineWM_COMPACTING0x0041//显示内存已经很少了
#defineWM_COMMNOTIFY0x0044/*nolongersuported*/
#defineWM_WINDOWPOSCHANGING0x0046//发送此消息给那个窗口的大小和位置将要被改变时,来调用setwindowpos函数或其它窗口管理函数
#defineWM_WINDOWPOSCHANGED0x0047//发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数
#defineWM_POWER0x0048//当系统将要进入暂停状态时发送此消息
/*
*wParamforWM_POWERwindowmessageandDRV_POWERdrivernotification
*/
#definePWR_OK1
#definePWR_FAIL(-1)
#definePWR_SUSPENDREQUEST1
#definePWR_SUSPENDRESUME2
#definePWR_CRITICALRESUME3
#defineWM_COPYDATA0x004A//当一个应用程序传递数据给另一个应用程序时发送此消息
#defineWM_CANCELJOURNAL0x004B//当某个用户取消程序日志激活状态,提交此消息给程序
/*
*lParamofWM_COPYDATAmessagepointsto...
*/
typedefstructtagCOPYDATASTRUCT{
ULONG_PTRdwData;
DWORDcbData;
PVOIDlpData;
}COPYDATASTRUCT,*PCOPYDATASTRUCT;
#if(WINVER>=0x0400)
typedefstructtagMDINEXTMENU
{
HMENUhmenuIn;
HMENUhmenuNext;
HWNDhwndNext;
}MDINEXTMENU,*PMDINEXTMENU,FAR*LPMDINEXTMENU;
#endif/*WINVER>=0x0400*/
#if(WINVER>=0x0400)
#defineWM_NOTIFY0x004E//当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口
#defineWM_INPUTLANGCHANGEREQUEST0x0050//当用户选择某种输入语言,或输入语言的热键改变
#defineWM_INPUTLANGCHANGE0x0051//当平台现场已经被改变后发送此消息给受影响的最顶级窗口
#defineWM_TCARD0x0052//当程序已经初始化windows帮助例程时发送此消息给应用程序
#defineWM_HELP0x0053//此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口
#defineWM_USERCHANGED0x0054//当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体设置信息,在用户更新设置时系统马上发送此消息
#defineWM_NOTIFYFORMAT0x0055//公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构
#defineNFR_ANSI1
#defineNFR_UNICODE2
#defineNF_QUERY3
#defineNF_REQUERY4
#defineWM_CONTEXTMENU0x007B//当用户某个窗口中点击了一下右键就发送此消息给这个窗口
#defineWM_STYLECHANGING0x007C//当调用SETWINDOWLONG函数将要改变一个或多个窗口的风格时发送此消息给那个窗口
#defineWM_STYLECHANGED0x007D//当调用SETWINDOWLONG函数一个或多个窗口的风格后发送此消息给那个窗口
#defineWM_DISPLAYCHANGE0x007E//当显示器的分辨率改变后发送此消息给所有的窗口
#defineWM_GETICON0x007F//此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄
#defineWM_SETICON0x0080//程序发送此消息让一个新的大图标或小图标与某个窗口关联
#endif/*WINVER>=0x0400*/
#defineWM_NCCREATE0x0081//当某个窗口第一次被创建时,此消息在WM_CREATE消息发送前发送
#defineWM_NCDESTROY0x0082//此消息通知某个窗口,非客户区正在销毁
#defineWM_NCCALCSIZE0x0083//当某个窗口的客户区域必须被核算时发送此消息
#defineWM_NCHITTEST0x0084//移动鼠标,按住或释放鼠标时发生
#defineWM_NCPAINT0x0085//程序发送此消息给某个窗口当它(窗口)的框架必须被绘制时
#defineWM_NCACTIVATE0x0086//此消息发送给某个窗口仅当它的非客户区需要被改变来显示是激活还是非激活状态
#defineWM_GETDLGCODE0x0087//发送此消息给某个与对话框程序关联的控件,widdows控制方位键和TAB键使输入进入此控件通过应
#ifndef_WIN32_WCE
#defineWM_SYNCPAINT0x0088
#endif
#defineWM_NCMOUSEMOVE0x00A0//当光标在一个窗口的非客户区内移动时发送此消息给这个窗口非客户区为:窗体的标题栏及窗的边框体
#defineWM_NCLBUTTONDOWN0x00A1//当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息
#defineWM_NCLBUTTONUP0x00A2//当用户释放鼠标左键同时光标某个窗口在非客户区时发送此消息
#defineWM_NCLBUTTONDBLCLK0x00A3//当用户双击鼠标左键同时光标某个窗口在非客户区时发送此消息
#defineWM_NCRBUTTONDOWN0x00A4//当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息
#defineWM_NCRBUTTONUP0x00A5//当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息
#defineWM_NCRBUTTONDBLCLK0x00A6//当用户双击鼠标右键同时光标某个窗口在非客户区时发送此消息
#defineWM_NCMBUTTONDOWN0x00A7//当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息
#defineWM_NCMBUTTONUP0x00A8//当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息
#defineWM_NCMBUTTONDBLCLK0x00A9//当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息#DeFineWM_KEYFIRST0x100
#if(_WIN32_WINNT>=0x0500)
#defineWM_NCXBUTTONDOWN0x00AB
#defineWM_NCXBUTTONUP0x00AC
#defineWM_NCXBUTTONDBLCLK0x00AD
#endif/*_WIN32_WINNT>=0x0500*/
#if(_WIN32_WINNT>=0x0501)
#defineWM_INPUT0x00FF
#endif/*_WIN32_WINNT>=0x0501*/
#defineWM_KEYFIRST0x0100
#defineWM_KEYDOWN0x0100//按下一个键
#defineWM_KEYUP0x0101//释放一个键
#defineWM_CHAR0x0102//按下某键,并已发出WM_KEYDOWN,WM_KEYUP消息
#defineWM_DEADCHAR0x0103//当用translatemessage函数翻译WM_KEYUP消息时发送此消息给拥有焦点的窗口
#defineWM_SYSKEYDOWN0x0104//当用户按住ALT键同时按下其它键时提交此消息给拥有焦点的窗口
#defineWM_SYSKEYUP0x0105//当用户释放一个键同时ALT键还按着时提交此消息给拥有焦点的窗口
#defineWM_SYSCHAR0x0106//当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后提交此消息给拥有焦点的窗口
#defineWM_SYSDEADCHAR0x0107//当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后发送此消息给拥有焦点的窗口
#if(_WIN32_WINNT>=0x0501)
#defineWM_UNICHAR0x0109
#defineWM_KEYLAST0x0109
#defineUNICODE_NOCHAR0xFFFF
#else
#defineWM_KEYLAST0x0108
#endif/*_WIN32_WINNT>=0x0501*/
#if(WINVER>=0x0400)
#defineWM_IME_STARTCOMPOSITION0x010D
#defineWM_IME_ENDCOMPOSITION0x010E
#defineWM_IME_COMPOSITION0x010F
#defineWM_IME_KEYLAST0x010F
#endif/*WINVER>=0x0400*/
#defineWM_INITDIALOG0x0110//在一个对话框程序被显示前发送此消息给它,通常用此消息初始化控件和执行其它任务
#defineWM_COMMAND0x0111//当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译
#defineWM_SYSCOMMAND0x0112//当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息
#defineWM_TIMER0x0113//发生了定时器事件
#defineWM_HSCROLL0x0114//当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口,也发送给拥有它的控件
#defineWM_VSCROLL0x0115//当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也,发送给拥有它的控件
#defineWM_INITMENU0x0116//当一个菜单将要被激活时发送此消息,它发生在用户菜单条中的某项或按下某个菜单键,它允许程序在显示前更改菜单
#defineWM_INITMENUPOPUP0x0117//当一个下拉菜单或子菜单将要被激活时发送此消息,它允许程序在它显示前更改菜单,而不要改变全部
#defineWM_MENUSELECT0x011F//当用户选择一条菜单项时发送此消息给菜单的所有者(一般是窗口)
#defineWM_MENUCHAR0x0120//当菜单已被激活用户按下了某个键(不同于加速键),发送此消息给菜单的所有者
#defineWM_ENTERIDLE0x0121//当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待
#if(WINVER>=0x0500)
#ifndef_WIN32_WCE
#defineWM_MENURBUTTONUP0x0122
#defineWM_MENUDRAG0x0123
#defineWM_MENUGETOBJECT0x0124
#defineWM_UNINITMENUPOPUP0x0125
#defineWM_MENUCOMMAND0x0126
#ifndef_WIN32_WCE
#if(_WIN32_WINNT>=0x0500)
#defineWM_CHANGEUISTATE0x0127
#defineWM_UPDATEUISTATE0x0128
#defineWM_QUERYUISTATE0x0129
/*
*LOWORD(wParam)valuesinWM_*UISTATE*
*/
#defineUIS_SET1
#defineUIS_CLEAR2
#defineUIS_INITIALIZE3
/*
*HIWORD(wParam)valuesinWM_*UISTATE*
*/
#defineUISF_HIDEFOCUS0x1
#defineUISF_HIDEACCEL0x2
#if(_WIN32_WINNT>=0x0501)
#defineUISF_ACTIVE0x4
#endif/*_WIN32_WINNT>=0x0501*/
#endif/*_WIN32_WINNT>=0x0500*/
#endif
#endif
#endif/*WINVER>=0x0500*/
#defineWM_CTLCOLORMSGBOX0x0132//在windows绘制消息框前发送此消息给消息框的所有者窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色
#defineWM_CTLCOLOREDIT0x0133//当一个编辑型控件将要被绘制时发送此消息给它的父窗口通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色
#defineWM_CTLCOLORLISTBOX0x0134//当一个列表框控件将要被绘制前发送此消息给它的父窗口通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色
#defineWM_CTLCOLORBTN0x0135//当一个按钮控件将要被绘制时发送此消息给它的父窗口通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色
#defineWM_CTLCOLORDLG0x0136//当一个对话框控件将要被绘制前发送此消息给它的父窗口通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色
#defineWM_CTLCOLORSCROLLBAR0x0137//当一个滚动条控件将要被绘制时发送此消息给它的父窗口通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色
#defineWM_CTLCOLORSTATIC0x0138//当一个静态控件将要被绘制时发送此消息给它的父窗口通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色
#defineMN_GETHMENU0x01E1
#defineWM_MOUSEFIRST0x0200//移动鼠标时发生
#defineWM_MOUSEMOVE0x0200//移动鼠标时发生,同WM_MOUSEFIRST
#defineWM_LBUTTONDOWN0x0201//按下鼠标左键
#defineWM_LBUTTONUP0x0202//释放鼠标左键
#defineWM_LBUTTONDBLCLK0x0203//双击鼠标左键
#defineWM_RBUTTONDOWN0x0204//按下鼠标右键
#defineWM_RBUTTONUP0x0205//释放鼠标右键
#defineWM_RBUTTONDBLCLK0x0206//双击鼠标右键
#defineWM_MBUTTONDOWN0x0207//按下鼠标中键
#defineWM_MBUTTONUP0x0208//释放鼠标中键
#defineWM_MBUTTONDBLCLK0x0209//双击鼠标中键
#if(_WIN32_WINNT>=0x0400)||(_WIN32_WINDOWS>0x0400)
#defineWM_MOUSEWHEEL0x020A//当鼠标轮子转动时发送此消息个当前有焦点的控件Buttons
#endif
#if(_WIN32_WINNT>=0x0500)
#defineWM_XBUTTONDOWN0x020B
#defineWM_XBUTTONUP0x020C
#defineWM_XBUTTONDBLCLK0x020D
#endif
#if(_WIN32_WINNT>=0x0500)
#defineWM_MOUSELAST0x020D
#elif(_WIN32_WINNT>=0x0400)||(_WIN32_WINDOWS>0x0400)
#defineWM_MOUSELAST0x020A
#else
#defineWM_MOUSELAST0x0209
#endif/*(_WIN32_WINNT>=0x0500)*/
#if(_WIN32_WINNT>=0x0400)
/*Valueforrollingonedetent*/
#defineWHEEL_DELTA120
#defineGET_WHEEL_DELTA_WPARAM(wParam)((short)HIWORD(wParam))
/*SettingtoscrollonepageforSPI_GET/SETWHEELSCROLLLINES*/
#defineWHEEL_PAGESCROLL(UINT_MAX)
#endif/*_WIN32_WINNT>=0x0400*/
#if(_WIN32_WINNT>=0x0500)
#defineGET_KEYSTATE_WPARAM(wParam)(LOWORD(wParam))
#defineGET_NCHITTEST_WPARAM(wParam)((short)LOWORD(wParam))
#defineGET_XBUTTON_WPARAM(wParam)(HIWORD(wParam))
/*XButtonvaluesareWORDflags*/
#defineXBUTTON10x0001
#defineXBUTTON20x0002
/*WeretheretobeanXBUTTON3,itsvaluewouldbe0x0004*/
#endif/*_WIN32_WINNT>=0x0500*/
#defineWM_PARENTNOTIFY0x0210
#defineWM_ENTERMENULOOP0x0211
#defineWM_EXITMENULOOP0x0212
#if(WINVER>=0x0400)
#defineWM_NEXTMENU0x0213
#defineWM_SIZING0x0214
#defineWM_CAPTURECHANGED0x0215
#defineWM_MOVING0x0216
#endif/*WINVER>=0x0400*/
#if(WINVER>=0x0400)
#defineWM_POWERBROADCAST0x0218
#ifndef_WIN32_WCE
#definePBT_APMQUERYSUSPEND0x0000
#definePBT_APMQUERYSTANDBY0x0001
#definePBT_APMQUERYSUSPENDFAILED0x0002
#definePBT_APMQUERYSTANDBYFAILED0x0003
#definePBT_APMSUSPEND0x0004
#definePBT_APMSTANDBY0x0005
#definePBT_APMRESUMECRITICAL0x0006
#definePBT_APMRESUMESUSPEND0x0007
#definePBT_APMRESUMESTANDBY0x0008
#definePBTF_APMRESUMEFROMFAILURE0x00000001
#definePBT_APMBATTERYLOW0x0009
#definePBT_APMPOWERSTATUSCHANGE0x000A
#definePBT_APMOEMEVENT0x000B
#definePBT_APMRESUMEAUTOMATIC0x0012
#endif
#endif/*WINVER>=0x0400*/
#if(WINVER>=0x0400)
#defineWM_DEVICECHANGE0x0219
#endif/*WINVER>=0x0400*/
#defineWM_MDICREATE0x0220
#defineWM_MDIDESTROY0x0221
#defineWM_MDIACTIVATE0x0222
#defineWM_MDIRESTORE0x0223
#defineWM_MDINEXT0x0224
#defineWM_MDIMAXIMIZE0x0225
#defineWM_MDITILE0x0226
#defineWM_MDICASCADE0x0227
#defineWM_MDIICONARRANGE0x0228
#defineWM_MDIGETACTIVE0x0229
#defineWM_MDISETMENU0x0230
#defineWM_ENTERSIZEMOVE0x0231
#defineWM_EXITSIZEMOVE0x0232
#defineWM_DROPFILES0x0233
#defineWM_MDIREFRESHMENU0x0234
#if(WINVER>=0x0400)
#defineWM_IME_SETCONTEXT0x0281
#defineWM_IME_NOTIFY0x0282
#defineWM_IME_CONTROL0x0283
#defineWM_IME_COMPOSITIONFULL0x0284
#defineWM_IME_SELECT0x0285
#defineWM_IME_CHAR0x0286
#endif/*WINVER>=0x0400*/
#if(WINVER>=0x0500)
#defineWM_IME_REQUEST0x0288
#endif/*WINVER>=0x0500*/
#if(WINVER>=0x0400)
#defineWM_IME_KEYDOWN0x0290
#defineWM_IME_KEYUP0x0291
#endif/*WINVER>=0x0400*/
#if((_WIN32_WINNT>=0x0400)||(WINVER>=0x0500))
#defineWM_MOUSEHOVER0x02A1
#defineWM_MOUSELEAVE0x02A3
#endif
#if(WINVER>=0x0500)
#defineWM_NCMOUSEHOVER0x02A0
#defineWM_NCMOUSELEAVE0x02A2
#endif/*WINVER>=0x0500*/
#if(_WIN32_WINNT>=0x0501)
#defineWM_WTSSESSION_CHANGE0x02B1
#defineWM_TABLET_FIRST0x02c0
#defineWM_TABLET_LAST0x02df
#endif/*_WIN32_WINNT>=0x0501*/
#defineWM_CUT0x0300
#defineWM_COPY0x0301
#defineWM_PASTE0x0302
#defineWM_CLEAR0x0303
#defineWM_UNDO0x0304
#defineWM_RENDERFORMAT0x0305
#defineWM_RENDERALLFORMATS0x0306
#defineWM_DESTROYCLIPBOARD0x0307
#defineWM_DRAWCLIPBOARD0x0308
#defineWM_PAINTCLIPBOARD0x0309
#defineWM_VSCROLLCLIPBOARD0x030A
#defineWM_SIZECLIPBOARD0x030B
#defineWM_ASKCBFORMATNAME0x030C
#defineWM_CHANGECBCHAIN0x030D
#defineWM_HSCROLLCLIPBOARD0x030E
#defineWM_QUERYNEWPALETTE0x030F
#defineWM_PALETTEISCHANGING0x0310
#defineWM_PALETTECHANGED0x0311
#defineWM_HOTKEY0x0312
#if(WINVER>=0x0400)
#defineWM_PRINT0x0317
#defineWM_PRINTCLIENT0x0318
#endif/*WINVER>=0x0400*/
#if(_WIN32_WINNT>=0x0500)
#defineWM_APPCOMMAND0x0319
#endif/*_WIN32_WINNT>=0x0500*/
#if(_WIN32_WINNT>=0x0501)
#defineWM_THEMECHANGED0x031A
#endif/*_WIN32_WINNT>=0x0501*/
#if(WINVER>=0x0400)
#defineWM_HANDHELDFIRST0x0358
#defineWM_HANDHELDLAST0x035F
#defineWM_AFXFIRST0x0360
#defineWM_AFXLAST0x037F
#endif/*WINVER>=0x0400*/
#defineWM_PENWINFIRST0x0380
#defineWM_PENWINLAST0x038F
EC_LEFTMARGINEC_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(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_LINEUP(0)向上滚动一行,SB_PAGEDOWN(3)向下滚动一页,SB_PAGEUP(2)向上滚动一页。
EM_REPLACESEL(&HC2=194),1(0),字符串用指定字符串替换编辑控件中的当前选定内容,如果第三个参数wParam为1,则本次操作允许撤消,0禁止撤消。字符串可用传值方式,也可用传址方式(例:SendMessageText1.hwnd,EM_REPLACESEL,0,Text2.Text'这是传值方式)
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发送消息的接收,在消息的接收方,覆写DefWindowProc(),在该方法中即可接收到sendmessage方法发送来的消息。因为sendmessage发送的消息,不再经过消息队列,而是直接发送给指定对象。所以一般的消息响应,包括PreTranslateMessage方法都无法接收到该信息,只能通过覆写DefWindowProc方法,来接收信息。