消息是怎样产生的?以及消息如何在应用程序及操作系统之间传递的呢?
当我们在窗口之中绘图或者进行其他操作的时候,比如单击鼠标右键,此时操作系统就会感知到这个事件,并把这个事件封装成一个消息,投递到应用程序的消息队列当中,然后应用程序从消息队列中提取消息并作出响应。
那什么又是消息队列呢?其实在每一个 windows 应用程序运行之前,操作系统都会为之创建一个消息队列,用来存放该程序创建的窗口的消息。
在 windows 系统当中,消息是由 MSG 结构体来表示的,具体定义如下图。
第一个成员变量 hwnd 表示消息所属的窗口,我们开发的应用程序通常而言都是窗口应用程序,所以说消息一般都是和某个窗口相关联的。
第二个成员变量 message 指定了消息的标识符,在 windows 当中,消息是以一个数值表示的,不同的消息有不同的数值。这样可以说很不方便我们的记忆,所以 windows 就讲消息定义为 WM_XXX 宏的形式,比如键盘按下的消息为 WM_KEYDOWN,字符消息为 WM_CHAR 等等。
第三、四个成员变量 wParam 和 lParam,用来指定消息的附加信息。当我们收到一个字符消息的时候,message 的值为 WM_CHAR,但用户到底输入的什么字符,就得 wParam 和 lParam来进行说明。
最后两个变量分别表示消息投递到消息队列中的时间和鼠标的当前位置。
当然消息还分为“进队消息”和“不进队消息”,所谓队列消息就是,消息经操作系统到应用程序的消息队列中,然后经应用程序进行取出及发送;不进对消息就是系统在调用窗口时直接发送给窗口。但不管是进队消息还是不进队消息,都是由系统调用窗口过程函数对消息进行处理。