一.消息机制原理
1.消息类型:
WIndows定义的一系列WM_XXX开头的,用来表示键盘按键,鼠标点击,窗口变化,用户自定义等各种消息;
2.消息队列:
Windows为每一个正在运行的程序维护一个消息队列应用程序的消息循环会从消息队列中获取消息,并对齐进行处理;
消息机制允许应用程序响应操作系统和用户操作,使得应用程序能够于操作系统进行有效交互,响应用户的操作和系统的通知,消息机制实际上是以回调函数的方式实现,不是类型安全的;
3.消息发送:
sendmessage发送消息,这个函数主要是向一个或多个窗口发送一条消息,一直等到消息被处理之后才会返回。不过需要注意的是,如果接收消息的窗口是同一个应用程序的一部分,那么这个窗口的窗口函数就被作为一个子程序马上被调用;如果接收消息的窗口是被另外的线程所创建的,那么窗口系统就切换到相应的线程并且调用相应的窗口函数,这条消息不会被放进目标应用程序队列中。函数的返回值是由接收消息的窗口的窗口函数返回,返回的值取决于被发送的消息;Postmassage函数把一条消息放置到创建hWnd窗口的线程的消息队列中,该函数不等消息被处理就马上将控制返回。需要注意的是,如果hWnd参数为 HWND_BROADCAST,那么,消息将被寄送给系统中的所有的重叠窗口和弹出窗口,但是子窗口不会收到该消息;如果hWnd参数为NULL,则该函数类似于将dwThreadID参数设置成当前线程的标志来调用PostThreadMEssage函数;
4.消息处理:
在WndProc函数中,用户程序通过switch-case语句来判断不同类型的消息,并对其进行相应的响应,比如:WM_CREATE消息在创建窗口是被发送,他只被发送一次,通常于窗口的构造函数相关联;
5.常见消息:
创建窗口消息WM_CREATE,销毁窗口消息WM_DESTROY,激活消息WM_ACTIVATE,系统命令消息WM_SYSCOMMAND,命令消息WM_COMMAND;
6.消息接收:
GetMessage用来获取与hWnd参数所指定的窗口相关的且wMsgFilterMin和wMsgFilterMax参数所给出的消息值范围内的消息;PeekMessage用于查看应用程序的消息队列,如果其中有消息就将其放入lpMsg所指的结构中,不过,与GetMessage不同的是,PeekMessage函数不会等到有消息放入队列时才返回;WaitMessage当一个应用程序无事可做时,该函数就将控制权交给另外的应用程序,同时将该应用程序挂起,直到一个新的消息被放入应用程序的队列之中才返回;
二.消息运转流程
消息运转流程用图来解释最好,看下图: