简述Windows消息传递机制
Windows是消息驱动系统,Windows消息提供应用程序之间以及应用程序和Windows系统之间的通信方式,应用程序希望实现功能来进行消息触发,并由消息的响应和处理完成,下面就跟着爱站技术频道小编来看看本文的介绍吧!
消息循环:
当初始化完成后,WinMain主函数就进入消息循环:
While(GetMessage(&msg,...)) { TranslateMessage(&msg);//转换键盘消息 DispatchMessage(&msg);//分派消息 }
窗口过程:
LRESULT CALLBACK WndProc(...) { ... switch( msg ) { case 1: ... case 2: ... Default: ... } return 0; }
下面以两个问题的方式进行具体概要。
问题1:消息有哪几种分类方法?
(1) 队列消息和非队列消息
队列消息会被送到系统消息队列,然后到线程消息队列。Windows维护一个系统消息队列,每个GUI线程也有一个线程消息队列。其中包括键盘鼠标消息,WM_PAINT、WM_TIMER、WM_QUIT。
这些队列消息以外的消息绝大多数都是非队列消息。
此处注意:消息队列中放置的消息是以MSG结构的形式存在,MSG包括:窗口句柄、消息标识、消息的两个参数(WPARAM和LPARAM)、消息发送(POST)的时间以及鼠标的位置。此外,可以利用::GetMessage函数和::PeekMessage函数来保存获得的消息信息。
非队列消息直接送给目的窗口过程。
(2) 系统消息和应用程序消息
系统消息ID范围 0X8000~0XBFFF
应用程序消ID范围0XC000~0XFFFF
为了应用程序消息的ID唯一性,可以使用::RegisterWindowMessage来得到特定的ID。
问题2:消息是如何进行传递、接收、处理的?
Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口,这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows。
此处注意:非队列消息直接送给目的窗口的窗口过程,队列消息由::DispatchMessage派发给目的窗口的窗口过程。窗口过程被调用时接收四个参数:窗口句柄、消息标识、两个32位的消息参数。在窗口过程里,用switch/case分支处理语句来识别和处理消息。
每个GDI应用程序在主窗口创建之后,都会进入消息循环,接受用户输入、解释和处理消息。消息循环从消息队列中得到消息,如果不是快捷键消息或对话框消息,就进行消息转换和派发,让目的窗口的窗口过程来处理。当得到消息WM_QUIT,或者::GetMessage出错时,退出消息循环。
以上就是爱站技术频道给大家介绍的简述Windows消息传递机制,看完都明白了吧,希望以上内容对诸多初学者有所帮助,更多必备知识请关注本站进行学习。
上一篇:详解C++中拷贝构造函数的应用