标题：SendMessage
函数功能
该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序，直到窗口程序处理完消息再返回。而和函数PostMessage不同，PostMessage是将一个消息寄送到一个线程的消息队列后就立即返回。
函数原型

LRESULT SendMessage（HWND hWnd，UINT Msg，WPARAM wParam，LPARAM IParam）；
参数hWnd：其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST，则消息将被发送到系统中所有顶层窗口，包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口，但消息不被发送到子窗口。
Msg：指定被发送的消息。
wParam：指定附加的消息特定信息。
IParam：指定附加的消息特定信息。
返回值：返回值指定消息处理的结果，依赖于所发送的消息。
备注：需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消息。
如果指定的窗口是由正在调用的线程创建的，则窗口程序立即作为子程序调用。如果指定的窗口是由不同线程创建的，则系统切换到该线程并调用恰当的窗口程序。线程间的消息只有在线程执行消息检索代码时才被处理。发送线程被阻塞直到接收线程处理完消息为止。
Windows CE：Windows CE不支持Windows桌面平台支持的所有消息。使用SendMesssge之前，要检查发送的消息是否被支持。
速查：Windows NT：3.1及以上版本：Windows：95及以上版本；Windows CE：1.0及以上版本；头文件：winuser.h；输入库：user32.lib；Unicode：在Windows NT环境下以Unicode和ANSI方式实现。
SendMessage函数使用实例
程序控制拉下或收起组合框的下拉列来
一般情况下，为了拉下或收起组合框的下拉列表，需要用键盘或鼠标进行操作，而有时我们希望程序运行的某个时刻自动拉出下拉列表（比如在一些演示程序中），为了实现这个目的，我们也只有借助于SendMessage函数，方法是发一个CB_SHOWDROPDOWN(&H14F)消息给组合框。
在发CB_SHOWDROPDOWN消息时，wParam参数决定了是拉下列表（=True时）还是收起列表（=False时），lParam无用（设为0）。
举例说明------------- C# -------------
一、API
命名空间
using System.Runtime.InteropServices;
函数原型
[DllImport("user32.dll ", EntryPoint = "SendMessage ")]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, string lParam);
二、CLT
命名空间
Microsoft.WindowsCE.Forms
函数语法
public static void SendMessage( ref Message m )
用法示例
Message msg = Message.Create(MsgWin.Hwnd, 
MsgWindow.WM_CUSTOMMSG, 
(IntPtr)e.X,
(IntPtr)e.Y);
MessageWindow.SendMessage(ref msg); 
------------- VB -------------
Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal _
wParam As Long, lParam As Any) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String _
) As Long
Private Const WM_close = 16
Private Sub Command1_Click()
Dim winHwnd As Long
Dim lngRetVal As Long
winHwnd = FindWindow("IEFrame", vbNullString)
Debug.Print winHwnd
If winHwnd <> 0 Then
RetVal = SendMessage(winHwnd, WM_close, 0&, 0&)
Else
MsgBox "IE没有运行。"
End If
End Sub
------------- C++ -----------------
#include "windows.h"
int main(int argc, char* argv[])
{
HWND hWnd = ::FindWindow(NULL,"QQ2010");
if( hWnd != NULL)
{
::SendMessage(hWnd,WM_CLOSE,0,0);
}
return 0;
}
为说明具体的使用方法，下面提供简单的程序片段。首先在代码模块中做如下声明：
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long,ByVal wMsg As Long，ByVal wParam As Long,lParam As Any) As Long
Const CB_SHOWDROPDOWN=&H14F
当程序中某处需要拉下组合框Combol的列表时，写如下调用语句：
SendMessage Combol.hwnd,CB_SHOWDROPDOWN,True,0
当需要收起组合框Combol的列表时，写如下语句：
SendMessage Combol.hwnd,CB_SHOWDROPDOWNN,False,0
The following are the ranges of message numbers. 
Range Meaning 
0 through WM_USER&Acirc;–1 Messages reserved for use by the system. 
WM_USER through 0x7FFF Integer messages for use by private window classes. 
WM_APP through 0xBFFF Messages available for use by applications. 
0xC000 through 0xFFFF String messages for use by applications. 
Greater than 0xFFFF Reserved by the system. 
Message numbers in the first range (0 through WM_USER&Acirc;–1) are defined by the system. Values in this range that are not explicitly defined are reserved by the system. 
Message numbers in the second range (WM_USER through 0x7FFF) can be defined and used by an application to send messages within a private window class. These values cannot be used to define messages that are meaningful throughout an application, because some predefined window classes already define values in this range. For example, predefined control classes such as BUTTON, EDIT, LISTBOX, and COMBOBOX may use these values. Messages in this range should not be sent to other applications unless the applications have been designed to exchange messages and to attach the same meaning to the message numbers. 
Message numbers in the third range (0x8000 through 0xBFFF) are available for application to use as private messages. Message in this range do not conflict with system messages. 
Message numbers in the fourth range (0xC000 through 0xFFFF) are defined at run time when an application calls the RegisterWindowMessage function to retrieve a message number for a string. All applications that register the same string can use the associated message number for exchanging messages. The actual message number, however, is not a constant and cannot be assumed to be the same between different sessions. 
Message numbers in the fifth range (greater than 0xFFFF) are reserved by the system.
#define WM_NULL 0x0000
#defineWM_CREATE 0x0001 //创建一个窗口
#define WM_DESTROY 0x0002 //当一个窗口被破坏时发送 
#define WM_MOVE 0x0003 //移动一个窗口 
#define WM_SIZE 0x0005 //改变一个窗口的大小 
#define WM_ACTIVATE 0x0006 //一个窗口被激活或失去激活状态
/*
* WM_ACTIVATE state values
*/
#define WA_INACTIVE 0
#define WA_ACTIVE 1
#define WA_CLICKACTIVE 2
#define WM_SETFOCUS 0x0007 //一个窗口获得焦点
#define WM_KILLFOCUS 0x0008 //一个窗口失去焦点
#define WM_ENABLE 0x000A //一个窗口改变成Enable状态
#define WM_SETREDRAW 0x000B //设置窗口是否能重画
#define WM_SETTEXT 0x000C //应用程序发送此消息来设置一个窗口的文本
#define WM_GETTEXT 0x000D //应用程序发送此消息来复制对应窗口的文本到缓冲区
#define WM_GETTEXTLENGTH 0x000E //得到与一个窗口有关的文本的长度（不包含空字符）
#define WM_PAINT 0x000F //要求一个窗口重画自己
#define WM_CLOSE 0x0010 //当一个窗口或应用程序要关闭时发送一个信号 
#ifndef _WIN32_WCE
#define WM_QUERYENDSESSION 0x0011 //当用户选择结束对话框或程序自己调用ExitWindows函数
#define WM_QUERYOPEN 0x0013 //当用户窗口恢复以前的大小位置时，把此消息发送给某个图标 
#define WM_ENDSESSION 0x0016 //当系统进程发出WM_QUERYENDSESSION消息后，此消息发送给应用程序，通知它对话是否结束 
#endif
#define WM_QUIT 0x0012 //用来结束程序运行 
#define WM_ERASEBKGND 0x0014 //当窗口背景必须被擦除时（例在窗口改变大小时） 
#define WM_SYSCOLORCHANGE 0x0015 //当系统颜色改变时，发送此消息给所有顶级窗口 
#define WM_SHOWWINDOW 0x0018 //当隐藏或显示窗口是发送此消息给这个窗口 
#define WM_WININICHANGE 0x001A
#if(WINVER >= 0x0400)
#define WM_SETTINGCHANGE WM_WININICHANGE
#endif /* WINVER >= 0x0400 */
#define WM_DEVMODECHANGE 0x001B
#define WM_ACTIVATEAPP 0x001C //发此消息给应用程序哪个窗口是激活的，哪个是非激活的 
#define WM_FONTCHANGE 0x001D //当系统的字体资源库变化时发送此消息给所有顶级窗口
#define WM_TIMECHANGE 0x001E //当系统的时间变化时发送此消息给所有顶级窗口 
#define WM_CANCELMODE 0x001F //发送此消息来取消某种正在进行的摸态（操作） 
#define WM_SETCURSOR 0x0020 //如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时，就发消息给某个窗口
#define WM_MOUSEACTIVATE 0x0021 //当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口
#define WM_CHILDACTIVATE 0x0022 //发送此消息给MDI子窗口当用户点击此窗口的标题栏，或当窗口被激活，移动，改变大小
#define WM_QUEUESYNC 0x0023 //此消息由基于计算机的训练程序发送，通过WH_JOURNALPALYBACK的hook程序分离出用户输入消息
#define WM_GETMINMAXINFO 0x0024 //此消息发送给窗口当它将要改变大小或位置 
/*
* Struct pointed to by WM_GETMINMAXINFO lParam
*/
typedef struct tagMINMAXINFO {
POINT ptReserved;
POINT ptMaxSize;
POINT ptMaxPosition;
POINT ptMinTrackSize;
POINT ptMaxTrackSize;
} MINMAXINFO, *PMINMAXINFO, *LPMINMAXINFO;
#define WM_PAINTICON 0x0026 //发送给最小化窗口当它图标将要被重画 
#define WM_ICONERASEBKGND 0x0027 //此消息发送给某个最小化窗口，仅当它在画图标前它的背景必须被重画 
#define WM_NEXTDLGCTL 0x0028 //发送此消息给一个对话框程序去更改焦点位置 
#define WM_SPOOLERSTATUS 0x002A //每当打印管理列队增加或减少一条作业时发出此消息 
#define WM_DRAWITEM 0x002B //当button，combobox，listbox，menu的可视外观改变时发送 
#define WM_MEASUREITEM 0x002C //当button, combo box, list box, list view control, or menu item 被创建时
#define WM_DELETEITEM 0x002D
#define WM_VKEYTOITEM 0x002E //此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息
#define WM_CHARTOITEM 0x002F //此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息
#define WM_SETFONT 0x0030 //当绘制文本时程序发送此消息得到控件要用的颜色
#define WM_GETFONT 0x0031 //应用程序发送此消息得到当前控件绘制文本的字体 
#define WM_SETHOTKEY 0x0032 //应用程序发送此消息让一个窗口与一个热键相关连
#define WM_GETHOTKEY 0x0033 //应用程序发送此消息来判断热键与某个窗口是否有关联 
#define WM_QUERYDRAGICON 0x0037 //此消息发送给最小化窗口，当此窗口将要被拖放而它的类中没有定义图标，应用程序能返回一个图标或光标的句柄，当用户拖放图标时系统显示这个图标或光标
#define WM_COMPAREITEM 0x0039 //发送此消息来判定combobox或listbox新增加的项的相对位置
#if(WINVER >= 0x0500)
#ifndef _WIN32_WCE
#define WM_GETOBJECT 0x003D
#endif
#endif /* WINVER >= 0x0500 */
#define WM_COMPACTING 0x0041 //显示内存已经很少了
#define WM_COMMNOTIFY 0x0044 /* no longer suported */
#define WM_WINDOWPOSCHANGING 0x0046 //发送此消息给那个窗口的大小和位置将要被改变时，来调用setwindowpos函数或其它窗口管理函数 
#define WM_WINDOWPOSCHANGED 0x0047 //发送此消息给那个窗口的大小和位置已经被改变时，来调用setwindowpos函数或其它窗口管理函数
#define WM_POWER 0x0048 //当系统将要进入暂停状态时发送此消息 
/*
* wParam for WM_POWER window message and DRV_POWER driver notification
*/
#define PWR_OK 1
#define PWR_FAIL (-1)
#define PWR_SUSPENDREQUEST 1
#define PWR_SUSPENDRESUME 2
#define PWR_CRITICALRESUME 3
#define WM_COPYDATA 0x004A //当一个应用程序传递数据给另一个应用程序时发送此消息 
#define WM_CANCELJOURNAL 0x004B //当某个用户取消程序日志激活状态，提交此消息给程序
/*
* lParam of WM_COPYDATA message points to...
*/
typedef struct tagCOPYDATASTRUCT {
ULONG_PTR dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
#if(WINVER >= 0x0400)
typedef struct tagMDINEXTMENU
{
HMENU hmenuIn;
HMENU hmenuNext;
HWND hwndNext;
} MDINEXTMENU, * PMDINEXTMENU, FAR * LPMDINEXTMENU;
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0400)
#define WM_NOTIFY 0x004E //当某个控件的某个事件已经发生或这个控件需要得到一些信息时，发送此消息给它的父窗口
#define WM_INPUTLANGCHANGEREQUEST 0x0050 //当用户选择某种输入语言，或输入语言的热键改变 
#define WM_INPUTLANGCHANGE 0x0051 //当平台现场已经被改变后发送此消息给受影响的最顶级窗口
#define WM_TCARD 0x0052 //当程序已经初始化windows帮助例程时发送此消息给应用程序
#define WM_HELP 0x0053 //此消息显示用户按下了F1，如果某个菜单是激活的，就发送此消息个此窗口关联的菜单，否则就发送给有焦点的窗口，如果当前都没有焦点，就把此消息发送给当前激活的窗口
#define WM_USERCHANGED 0x0054 //当用户已经登入或退出后发送此消息给所有的窗口，当用户登入或退出时系统更新用户的具体设置信息，在用户更新设置时系统马上发送此消息 
#define WM_NOTIFYFORMAT 0x0055 //公用控件，自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构
#define NFR_ANSI 1
#define NFR_UNICODE 2
#define NF_QUERY 3
#define NF_REQUERY 4
#define WM_CONTEXTMENU 0x007B //当用户某个窗口中点击了一下右键就发送此消息给这个窗口
#define WM_STYLECHANGING 0x007C //当调用SETWINDOWLONG函数将要改变一个或多个 窗口的风格时发送此消息给那个窗口 
#define WM_STYLECHANGED 0x007D //当调用SETWINDOWLONG函数一个或多个 窗口的风格后发送此消息给那个窗口
#define WM_DISPLAYCHANGE 0x007E //当显示器的分辨率改变后发送此消息给所有的窗口
#define WM_GETICON 0x007F //此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄
#define WM_SETICON 0x0080 //程序发送此消息让一个新的大图标或小图标与某个窗口关联
#endif /* WINVER >= 0x0400 */
#define WM_NCCREATE 0x0081 //当某个窗口第一次被创建时，此消息在WM_CREATE消息发送前发送
#define WM_NCDESTROY 0x0082 //此消息通知某个窗口，非客户区正在销毁
#define WM_NCCALCSIZE 0x0083 //当某个窗口的客户区域必须被核算时发送此消息 
#define WM_NCHITTEST 0x0084 //移动鼠标，按住或释放鼠标时发生
#define WM_NCPAINT 0x0085 //程序发送此消息给某个窗口当它（窗口）的框架必须被绘制时 
#define WM_NCACTIVATE 0x0086 //此消息发送给某个窗口仅当它的非客户区需要被改变来显示是激活还是非激活状态 
#define WM_GETDLGCODE 0x0087 //发送此消息给某个与对话框程序关联的控件，widdows控制方位键和TAB键使输入进入此控件通过应 
#ifndef _WIN32_WCE
#define WM_SYNCPAINT 0x0088
#endif
#define WM_NCMOUSEMOVE 0x00A0 //当光标在一个窗口的非客户区内移动时发送此消息给这个窗口 非客户区为：窗体的标题栏及窗 的边框体 
#define WM_NCLBUTTONDOWN 0x00A1 //当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息
#define WM_NCLBUTTONUP 0x00A2 //当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息
#define WM_NCLBUTTONDBLCLK 0x00A3 //当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息
#define WM_NCRBUTTONDOWN 0x00A4 //当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息
#define WM_NCRBUTTONUP 0x00A5 //当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息
#define WM_NCRBUTTONDBLCLK 0x00A6 //当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息
#define WM_NCMBUTTONDOWN 0x00A7 //当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息
#define WM_NCMBUTTONUP 0x00A8 //当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息
#define WM_NCMBUTTONDBLCLK 0x00A9 //当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息#DeFine WM_KEYFIRST 0x100 
#if(_WIN32_WINNT >= 0x0500)
#define WM_NCXBUTTONDOWN 0x00AB
#define WM_NCXBUTTONUP 0x00AC
#define WM_NCXBUTTONDBLCLK 0x00AD
#endif /* _WIN32_WINNT >= 0x0500 */
#if(_WIN32_WINNT >= 0x0501)
#define WM_INPUT 0x00FF
#endif /* _WIN32_WINNT >= 0x0501 */
#define WM_KEYFIRST 0x0100
#define WM_KEYDOWN 0x0100 //按下一个键
#define WM_KEYUP 0x0101 //释放一个键
#define WM_CHAR 0x0102 //按下某键，并已发出WM_KEYDOWN， WM_KEYUP消息
#define WM_DEADCHAR 0x0103 //当用translatemessage函数翻译WM_KEYUP消息时发送此消息给拥有焦点的窗口
#define WM_SYSKEYDOWN 0x0104 //当用户按住ALT键同时按下其它键时提交此消息给拥有焦点的窗口
#define WM_SYSKEYUP 0x0105 //当用户释放一个键同时ALT 键还按着时提交此消息给拥有焦点的窗口
#define WM_SYSCHAR 0x0106 //当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后提交此消息给拥有焦点的窗口
#define WM_SYSDEADCHAR 0x0107 //当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后发送此消息给拥有焦点的窗口
#if(_WIN32_WINNT >= 0x0501)
#define WM_UNICHAR 0x0109
#define WM_KEYLAST 0x0109
#define UNICODE_NOCHAR 0xFFFF
#else
#define WM_KEYLAST 0x0108
#endif /* _WIN32_WINNT >= 0x0501 */
#if(WINVER >= 0x0400)
#define WM_IME_STARTCOMPOSITION 0x010D
#define WM_IME_ENDCOMPOSITION 0x010E
#define WM_IME_COMPOSITION 0x010F
#define WM_IME_KEYLAST 0x010F
#endif /* WINVER >= 0x0400 */
#define WM_INITDIALOG 0x0110 //在一个对话框程序被显示前发送此消息给它，通常用此消息初始化控件和执行其它任务
#define WM_COMMAND 0x0111 //当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口，一个快捷键被翻译 
#define WM_SYSCOMMAND 0x0112 //当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息
#define WM_TIMER 0x0113 //发生了定时器事件 
#define WM_HSCROLL 0x0114 //当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口，也发送给拥有它的控件
#define WM_VSCROLL 0x0115 //当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也，发送给拥有它的控件
#define WM_INITMENU 0x0116 //当一个菜单将要被激活时发送此消息，它发生在用户菜单条中的某项或按下某个菜单键，它允许程序在显示前更改菜单 
#define WM_INITMENUPOPUP 0x0117 //当一个下拉菜单或子菜单将要被激活时发送此消息，它允许程序在它显示前更改菜单，而不要改变全部 
#define WM_MENUSELECT 0x011F //当用户选择一条菜单项时发送此消息给菜单的所有者（一般是窗口） 
#define WM_MENUCHAR 0x0120 //当菜单已被激活用户按下了某个键（不同于加速键），发送此消息给菜单的所有者 
#define WM_ENTERIDLE 0x0121 //当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者，一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待 
#if(WINVER >= 0x0500)
#ifndef _WIN32_WCE
#define WM_MENURBUTTONUP 0x0122
#define WM_MENUDRAG 0x0123
#define WM_MENUGETOBJECT 0x0124
#define WM_UNINITMENUPOPUP 0x0125
#define WM_MENUCOMMAND 0x0126
#ifndef _WIN32_WCE
#if(_WIN32_WINNT >= 0x0500)
#define WM_CHANGEUISTATE 0x0127
#define WM_UPDATEUISTATE 0x0128
#define WM_QUERYUISTATE 0x0129
/*
* LOWORD(wParam) values in WM_*UISTATE*
*/
#define UIS_SET 1
#define UIS_CLEAR 2
#define UIS_INITIALIZE 3
/*
* HIWORD(wParam) values in WM_*UISTATE*
*/
#define UISF_HIDEFOCUS 0x1
#define UISF_HIDEACCEL 0x2
#if(_WIN32_WINNT >= 0x0501)
#define UISF_ACTIVE 0x4
#endif /* _WIN32_WINNT >= 0x0501 */
#endif /* _WIN32_WINNT >= 0x0500 */
#endif
#endif
#endif /* WINVER >= 0x0500 */
#define WM_CTLCOLORMSGBOX 0x0132 //在windows绘制消息框前发送此消息给消息框的所有者窗口，通过响应这条消息，所有者窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色
#define WM_CTLCOLOREDIT 0x0133 //当一个编辑型控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息，所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色 
#define WM_CTLCOLORLISTBOX 0x0134 //当一个列表框控件将要被绘制前发送此消息给它的父窗口 通过响应这条消息，所有者窗口可以通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色
#define WM_CTLCOLORBTN 0x0135 //当一个按钮控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息，所有者窗口可以通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色
#define WM_CTLCOLORDLG 0x0136 //当一个对话框控件将要被绘制前发送此消息给它的父窗口 通过响应这条消息，所有者窗口可以通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色
#define WM_CTLCOLORSCROLLBAR 0x0137 //当一个滚动条控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息，所有者窗口可以通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色
#define WM_CTLCOLORSTATIC 0x0138 //当一个静态控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息，所有者窗口可以 通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色 
#define MN_GETHMENU 0x01E1
#define WM_MOUSEFIRST 0x0200 //移动鼠标时发生 
#define WM_MOUSEMOVE 0x0200 //移动鼠标时发生，同WM_MOUSEFIRST 
#define WM_LBUTTONDOWN 0x0201 //按下鼠标左键 
#define WM_LBUTTONUP 0x0202 //释放鼠标左键
#define WM_LBUTTONDBLCLK 0x0203 //双击鼠标左键 
#define WM_RBUTTONDOWN 0x0204 //按下鼠标右键 
#define WM_RBUTTONUP 0x0205 //释放鼠标右键
#define WM_RBUTTONDBLCLK 0x0206 //双击鼠标右键 
#define WM_MBUTTONDOWN 0x0207 //按下鼠标中键
#define WM_MBUTTONUP 0x0208 //释放鼠标中键 
#define WM_MBUTTONDBLCLK 0x0209 //双击鼠标中键
#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
#define WM_MOUSEWHEEL 0x020A //当鼠标轮子转动时发送此消息个当前有焦点的控件 Buttons
#endif
#if (_WIN32_WINNT >= 0x0500)
#define WM_XBUTTONDOWN 0x020B
#define WM_XBUTTONUP 0x020C
#define WM_XBUTTONDBLCLK 0x020D
#endif
#if (_WIN32_WINNT >= 0x0500)
#define WM_MOUSELAST 0x020D
#elif (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
#define WM_MOUSELAST 0x020A
#else
#define WM_MOUSELAST 0x0209
#endif /* (_WIN32_WINNT >= 0x0500) */
#if(_WIN32_WINNT >= 0x0400)
/* Value for rolling one detent */
#define WHEEL_DELTA 120
#define GET_WHEEL_DELTA_WPARAM(wParam) ((short)HIWORD(wParam))
/* Setting to scroll one page for SPI_GET/SETWHEELSCROLLLINES */
#define WHEEL_PAGESCROLL (UINT_MAX)
#endif /* _WIN32_WINNT >= 0x0400 */
#if(_WIN32_WINNT >= 0x0500)
#define GET_KEYSTATE_WPARAM(wParam) (LOWORD(wParam))
#define GET_NCHITTEST_WPARAM(wParam) ((short)LOWORD(wParam))
#define GET_XBUTTON_WPARAM(wParam) (HIWORD(wParam))
/* XButton values are WORD flags */
#define XBUTTON1 0x0001
#define XBUTTON2 0x0002
/* Were there to be an XBUTTON3, its value would be 0x0004 */
#endif /* _WIN32_WINNT >= 0x0500 */
#define WM_PARENTNOTIFY 0x0210
#define WM_ENTERMENULOOP 0x0211
#define WM_EXITMENULOOP 0x0212
#if(WINVER >= 0x0400)
#define WM_NEXTMENU 0x0213
#define WM_SIZING 0x0214
#define WM_CAPTURECHANGED 0x0215
#define WM_MOVING 0x0216
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0400)
#define WM_POWERBROADCAST 0x0218
#ifndef _WIN32_WCE
#define PBT_APMQUERYSUSPEND 0x0000
#define PBT_APMQUERYSTANDBY 0x0001
#define PBT_APMQUERYSUSPENDFAILED 0x0002
#define PBT_APMQUERYSTANDBYFAILED 0x0003
#define PBT_APMSUSPEND 0x0004
#define PBT_APMSTANDBY 0x0005
#define PBT_APMRESUMECRITICAL 0x0006
#define PBT_APMRESUMESUSPEND 0x0007
#define PBT_APMRESUMESTANDBY 0x0008
#define PBTF_APMRESUMEFROMFAILURE 0x00000001
#define PBT_APMBATTERYLOW 0x0009
#define PBT_APMPOWERSTATUSCHANGE 0x000A
#define PBT_APMOEMEVENT 0x000B
#define PBT_APMRESUMEAUTOMATIC 0x0012
#endif
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0400)
#define WM_DEVICECHANGE 0x0219
#endif /* WINVER >= 0x0400 */
#define WM_MDICREATE 0x0220
#define WM_MDIDESTROY 0x0221
#define WM_MDIACTIVATE 0x0222
#define WM_MDIRESTORE 0x0223
#define WM_MDINEXT 0x0224
#define WM_MDIMAXIMIZE 0x0225
#define WM_MDITILE 0x0226
#define WM_MDICASCADE 0x0227
#define WM_MDIICONARRANGE 0x0228
#define WM_MDIGETACTIVE 0x0229
#define WM_MDISETMENU 0x0230
#define WM_ENTERSIZEMOVE 0x0231
#define WM_EXITSIZEMOVE 0x0232
#define WM_DROPFILES 0x0233
#define WM_MDIREFRESHMENU 0x0234
#if(WINVER >= 0x0400)
#define WM_IME_SETCONTEXT 0x0281
#define WM_IME_NOTIFY 0x0282
#define WM_IME_CONTROL 0x0283
#define WM_IME_COMPOSITIONFULL 0x0284
#define WM_IME_SELECT 0x0285
#define WM_IME_CHAR 0x0286
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0500)
#define WM_IME_REQUEST 0x0288
#endif /* WINVER >= 0x0500 */
#if(WINVER >= 0x0400)
#define WM_IME_KEYDOWN 0x0290
#define WM_IME_KEYUP 0x0291
#endif /* WINVER >= 0x0400 */
#if((_WIN32_WINNT >= 0x0400) || (WINVER >= 0x0500))
#define WM_MOUSEHOVER 0x02A1
#define WM_MOUSELEAVE 0x02A3
#endif
#if(WINVER >= 0x0500)
#define WM_NCMOUSEHOVER 0x02A0
#define WM_NCMOUSELEAVE 0x02A2
#endif /* WINVER >= 0x0500 */
#if(_WIN32_WINNT >= 0x0501)
#define WM_WTSSESSION_CHANGE 0x02B1
#define WM_TABLET_FIRST 0x02c0
#define WM_TABLET_LAST 0x02df
#endif /* _WIN32_WINNT >= 0x0501 */
#define WM_CUT 0x0300
#define WM_COPY 0x0301
#define WM_PASTE 0x0302
#define WM_CLEAR 0x0303
#define WM_UNDO 0x0304
#define WM_RENDERFORMAT 0x0305
#define WM_RENDERALLFORMATS 0x0306
#define WM_DESTROYCLIPBOARD 0x0307
#define WM_DRAWCLIPBOARD 0x0308
#define WM_PAINTCLIPBOARD 0x0309
#define WM_VSCROLLCLIPBOARD 0x030A
#define WM_SIZECLIPBOARD 0x030B
#define WM_ASKCBFORMATNAME 0x030C
#define WM_CHANGECBCHAIN 0x030D
#define WM_HSCROLLCLIPBOARD 0x030E
#define WM_QUERYNEWPALETTE 0x030F
#define WM_PALETTEISCHANGING 0x0310
#define WM_PALETTECHANGED 0x0311
#define WM_HOTKEY 0x0312
#if(WINVER >= 0x0400)
#define WM_PRINT 0x0317
#define WM_PRINTCLIENT 0x0318
#endif /* WINVER >= 0x0400 */
#if(_WIN32_WINNT >= 0x0500)
#define WM_APPCOMMAND 0x0319
#endif /* _WIN32_WINNT >= 0x0500 */
#if(_WIN32_WINNT >= 0x0501)
#define WM_THEMECHANGED 0x031A
#endif /* _WIN32_WINNT >= 0x0501 */
#if(WINVER >= 0x0400)
#define WM_HANDHELDFIRST 0x0358
#define WM_HANDHELDLAST 0x035F
#define WM_AFXFIRST 0x0360
#define WM_AFXLAST 0x037F
#endif /* WINVER >= 0x0400 */
#define WM_PENWINFIRST 0x0380
#define WM_PENWINLAST 0x038F
常用编辑控件消息
EC_LEFTMARGIN EC_USEFONTINF 设置左边距时使用
EC_RIGHTMARGIN EC_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),1 RichEdit控件粘贴剪贴板中的位图(或文本)
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禁止撤消。字符串可用传值方式，也可用传址方式（例：SendMessage Text1.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消息规定的界限，或超出由VB Maxlength属性规定的界限，就会发送这条消息 。此外，倘若不允许自动进行水平滚动，同时插入点要超出控件的宽度；或者不允许自动垂直滚动，同时插入点要超出控件的高度，那么也会触发这条消息。在没有 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方法，来接收信息。