1、windows消息分类:
窗口消息:与窗口相关,以WM_开头的消息,除WM_COMMAND外。
命令消息:WM_COMMAND消息,处理用户请求
控件通知消息:WM_NOTIFY
用户自定义消息:(WM_USER、 WM_APP)
2、windows消息系统组成:
消息队列:操作系统负责为进程维护一个消息队列,程序运行时不断地从消息队列进行消息的获取,处理消息
消息循环:应用程序不断地获取消息,处理消息构成消息循环。
消息处理:消息循环负责将消息派发到相关的窗口使用关联的窗口过程函数进行处理。
3、win32消息路由
1. 消息产生
2. 系统将消息排列到其应该排放的线程的消息队列中。
3. 线程中的消息循环调用GetMessage (or PeekMessage )获取消息。
4. 传送消息TranslateMessage and DispatchMessage to 窗口过程。
5. 在窗口过程中进行消息处理。
4、消息处理
应用程序的消息机制主要由消息循环来处理:
- while (GetMessage(&msg, NULL, 0, 0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
GetMessage 函数从应用程序的队列里取出一个消息,如果这个消息是 WM_QUIT(程序退出消息)就返回 0,结束 while 循环。如果不是退出消息,那么就执行 TranslateMessage 翻译消息,这个操作主要是对一些消息进行转换,例如把键盘的虚拟键消息转换为字符消息。
接着调用 DispatchMessage 将消息分派给相应的窗口过程。
注意:他不是直接通过 DispatchMessage 调用我们的窗口过程 WndProc,这里其实 DispatchMessage 是带着消息去找操作系统,然后再由操作系统调用 WndProc 窗口过程。看起来有点纠结哈,不过这就是消息机制的一个真实面目,操作系统为了绝对的控制权,时时刻刻都监控着应用程序的运行。
在窗口过程中,我们对感兴趣的消息进行监控并部署相应的代码,对不感兴趣的消息我们都扔给DefWindowProc,让操作系统以默认的方式来处理消息。