消息自己是做为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其余信息。这个记录类型叫作MSG,MSG含有来自windows应用程序消息队列的消息信息,在Windows中MSG结构体定义以下:windows
typedef struct tagMsg { HWND hwnd; //接受该消息的窗口句柄 UINT message; //消息常量标识符,也就是咱们一般所说的消息号 WPARAM wParam; //32位消息的特定附加信息,确切含义依赖于消息值 LPARAM lParam; //32位消息的特定附加信息,确切含义依赖于消息值 DWORD time; //消息建立时的时间 POINT pt; //消息建立时的鼠标/光标在屏幕坐标系中的位置 }MSG; hwnd - - - 一个32位的窗口句柄(个人PC是32 位的),它表示的是消息所属的窗口。咱们一般开发的程序都是窗口应用程序,通常一个消息都是和某个窗口相关联的。好比咱们在某个活动窗口按下鼠标右键,此时产生的消息就是发送给该活动窗口的。窗口能够是任何类型的屏幕对象,由于Win32可以维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。 (补充一下:“句柄”\---在Windows程序中,有各类各样的资源,系统在建立这些资源的时候,都会为他们分配内存,并返回标识这些资源的标识号,这个标识号就是句柄) message\- - - -一个消息的标识符,用于区别其余消息的常量值,这些常量能够是Windows单元中预约义的常量,也能够是自定义的常量。在Windows中消息是由一个数值表示的,不一样的消息对应不一样的数值。但因为当这些消息种类多到足以挑战咱们的IQ,因此聪明的程序开发者便想到将这些数值定义为WM\_XXX宏的形式。例如,鼠标左键按下的消息--WM\_LBUTTONDOWN,键盘按下消息--WM\_KEYDOWN,字符消息--WM\_CHAR,等等。。。。消息标识符以常量命名的方式指出消息的含义。当窗口过程接收到消息以后,他就会使用消息标识符来决定如何处理消息。例如、WM\_PAINT告诉窗口过程窗体客户区被改变了须要重绘。符号常量指定系统消息属于的类别,其前缀指明了处理解释消息的窗体的类型。 wParam和lParam- \- - 用于指定消息的附加信息。例如,当咱们收到一个键盘按下消息的时候,message成员变量的值就是WM\_KEYDOWN,可是用户到底按下的是哪个按键,咱们就得拜托这二位,由他们来告知咱们具体的信息。 time和pt- \- -这俩兄弟分别被用来表示消息投递到消息队列中的时间和鼠标当前的位置,通常状况下不怎么使用(但不表明没用)
WM\_NULL---0x0000 空消息。 0x0001----0x0087 主要是窗口消息。 0x00A0----0x00A9 非客户区消息 0x0100----0x0108 键盘消息 0x0111----0x0126 菜单消息 0x0132----0x0138 颜色控制消息 0x0200----0x020A 鼠标消息 0x0211----0x0213 菜单循环消息 0x0220----0x0230 多文档消息 0x03E0----0x03E8 DDE消息 0x0400 WM\_USER 0x8000 WM\_APP 0x0400----0x7FFF 应用程序自定义私有消息
系统定义消息(System-Defined Messages)
在SDK中事先定义好的消息,非用户定义的,其范围在[0x0000, 0x03ff]之间, 能够分为如下三类: 函数
与窗口的内部运做有关,如建立窗口,绘制窗口,销毁窗口等。能够是通常的窗口,也能够是Dialog,控件等。
如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL... 工具
与处理用户请求有关, 如单击菜单项或工具栏或控件时, 就会产生命令消息。
WM_COMMAND, LOWORD(wParam)表示菜单项,工具栏按钮或控件的ID。若是是控件, HIWORD(wParam)表示控件消息类型 线程
控件通知消息, 这是最灵活的消息格式, 其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHDR的指针。NMHDR包含控件通知的内容, 能够任意扩展。指针
程序定义消息(Application-Defined Messages)
用户自定义的消息, 对于其范围有以下规定:
WM_USER: 0x0400-0x7FFF (ex. WM_USER+10)
WM_APP(winver> 4.0): 0x8000-0xBFFF (ex.WM_APP+4)
RegisterWindowMessage: 0xC000-0xFFFFcode
消息队列对象
系统消息队列(System Message Queue)
这是一个系统惟一的Queue,设备驱动(mouse, keyboard)会把操做输入转化成消息存在系统队列中,而后系统会把此消息放到目标窗口所在的线程的消息队列(thread-specific message queue)中等待处理
线程消息队列(Thread-specific Message Queue)
每个GUI线程都会维护这样一个线程消息队列。(这个队列只有在线程调用GDI函数时才会建立,默认不建立)。而后线程消息队列中的消息会被送到相应的窗口过程(WndProc)处理.
注意: 线程消息队列中WM_PAINT,WM_TIMER只有在Queue中没有其余消息的时候才会被处理,WM_PAINT消息还会被合并以提升效率。其余全部消息以先进先出(FIFO)的方式被处理。队列