简单来说,消息就是一个系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用程序某个事情发生了,比如敲击一个键盘,移动鼠标。

消息的结构体类型:
typedef struct tagMsg
{
HWND hwnd; //接受该消息的窗口句柄
UINT message; //消息常量标识符,也就是我们通常所说的消息号
WPARAM wParam; //32位消息的特定附加信息,确切含义依赖于消息值
LPARAM lParam; //32位消息的特定附加信息,确切含义依赖于消息值
DWORD time; //消息创建时的时间
POINT pt; //消息创建时的鼠标/光标在屏幕坐标系中的位置
}MSG;
windows中消息类型主要有2种:
窗口消息:(1)它是指由操作系统和控制其他窗口的窗口所使用的消息

命令消息:(2)系统消息定义从0到0x3ff,可以使用0x400到0x7fff定义自己的消息。
其中,windows把0x400定义为WM_USER,我们可以使用WM_USER +数值
BEGIN_MESSAGE_NAP()和END_MESSAGE_MAP()宏定义这个消息映射的边界
BEGIN_MESSAGE_MAP()宏有两个参数,第一个参数为定义消息映射的当前类名,第二个参数提供一个到该基类的连接,查消息处理程序。如果在定义消息映射的类中没有发现消息处理程序,将搜索基类的消息映射。


自定义消息实现步骤:

1.声明消息

#define WM_SOCKET WM_user+200

2.类声明中声明消息映射

DECLARE_MESSAGE_MAP()
3.类声明中定义消息处理函数:
LRESULT afx_msg OnSocket(WPARAM,LPARAM);

4.实现消息映射

BEGIN_MESSAGE_MAP()

ON_MESSAGE(WM_SOCKET)

5.实现消息处理函数

LRESULT CMYSOCKET::OnSOCKET(WPRATM,LPARAM lparam)
{///
return 1;}

在做网络编程时候使用多线程来接收数据显得麻烦 不够简洁优雅,在参考其他人的文件后发现了早就定义好的函数实现了需要的功能:

WSAAsyncSelect()函数自动把套接字设为非阻塞模式,并且为套接字绑定一个窗口句柄,当有网络事件发生时,便向这个窗口发送消息。
所以我们就在调用了这个函数后只需要实现对网络不同事件进行相应的处理就OK。