1、系统定义消息(System-Defined Messages)
窗口消息(Windows Message):与窗口的内部运作有关(创建、绘制、销毁等)
命令消息(Command Message):与处理用户请求有关(单击菜单、工具栏、控件等)——WM_COMMAND
控件消息(Notify Message):控件通知消息,非常灵活,原因是lParam传递的参数是一个指向NMHDR的指针,NMHDR包含控件通知的内容, 可以任意扩展。
2、程序定义消息(Application-Defined Messages)
消息队列
Windows中有两种类型的消息队列:
1、系统消息队列(System Message Queue)
这是一个系统唯一的Queue,设备驱动(mouse, keyboard)会把操作输入转化成消息存在系统队列中,然后系统会把此消息放到目标窗口所在线程的消息队列中等待处理。
2、线程消息队列(Thread-Specified Message Queue)
每一个GUI线程都会维护这样一个线程消息队列。(这个队列只有在线程调用GDI函数或者调用GetMessage、PeekMessage时才会创建,默认不创建)。线程消息队列中的消息接着会被送到相应的窗口过程(WndProc)处理。
队列消息(Queued Messages)和非队列消息 (Non-Queued Messages)
队列消息:消息会先保存在消息队列中,消息循环会从此队列中取消息并分发到各窗口处理,如鼠标、键盘消息。
非队列消息:消息会绕过系统消息队列和线程消息队列直接发送到窗口过程被处理。如: WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR, WM_WINDOWPOSCHANGED等。
PostMessage、PostThreadMessage和SendMessage
PostMessage: 把消息放到指定窗口所在的线程的消息队列中后立即返回。 (异步)
PostThreadMessage:把消息放到指定线程的消息队列中后立即返回。(异步)
SendMessage:直接把消息送到窗口过程处理, 处理完了才返回(等待消息被处理的时候,发送消息的线程处于阻塞状态)。(同步)
GetMessage和PeekMessage
GetMessage:在有消息时返回,并从消息队列中删除该消息。(同步)
PeekMessage:立即返回,可以保留消息也可以移除消息。(保留消息的时候相当于偷窥一眼消息内容)(异步)
这两个函数还有一个作用就是在调用线程中强制创建一个消息队列。
TranslateMessage和TranslateAccelerator
TranslateMessage:把一个virtual-key消息转化成字符消息(character message),并放到当前线程的消息队列中,消息循环下一次取出处理。
TranslateAccelerator :将快捷键对应到相应的菜单命令。它会把WM_KEYDOWN 或 WM_SYSKEYDOWN转化成快捷键表中相应的WM_COMMAND 或WM_SYSCOMMAND消息, 然后把转化后的 WM_COMMAND或WM_SYSCOMMAND直接发送到窗口过程处理, 处理完后才会返回。