windows——消息——队列化消息 非队列化消息

来源:互联网 发布:数据之魅 编辑:程序博客网 时间:2024/06/05 09:43

队列化消息&非队列化消息

windows消息分两类:
  • 队列化消息:消息先进入程序消息队列中,通过消息循环依次发送消息给窗口消息处理程序
  • 非队列化消息:消息不进入程序消息队列中,直接发送消息给窗口消息处理程序
任何情况下,窗口消息处理程序都将获得窗口所有消息(包括队列化消息和非队列化消息),窗口消息处理程序是窗口的消息中心
队列化消息:
  • 队列化消息基本上是使用者输入的结果,以键盘相关消息,鼠标相关消息的形式给出
  • 队列化消息还包括时钟消息(WM_TIMER),更新消息(WM_PAINT),退出消息(WM_QUIT)
非队列化消息:
  • 非队列化消息则是其它消息,许多情况下,非队列化消息来自调用特定windows函数,如调用CreateWindow会给窗口消息处理程序发送WM_CREATE,调用ShowWindow会给窗口消息处理程序发送WM_SIZE和WM_SHOWWINDOW,调用UpdateWindow会给窗口消息处理程序发送WM_PAINT
  • 键盘或鼠标输入时发出的队列化消息,也能在非队列化消息中出现,如键盘或鼠标选择了一个菜单项时,键盘或鼠标消息是队列化的,而说明菜单项已选中的WM_COMMAND可能是非队列化的

窗口消息处理程序

  • 窗口消息处理程序处理消息是以一种有序的,同步的方式进出的,在一个窗口消息处理程序中处理消息时,程序不会被其它消息突然中断
  • windows程序可多线程执行,但每个线程的消息队列只为窗口消息处理程序在该线程中执行的窗口处理消息,即消息循环和窗口消息处理程序不是并发执行的,当一个消息循环从其消息队列中接收一个消息,然后呼叫DispatchMessage将消息发送给窗口消息处理程序时,直到窗口消息处理程序将控制返回给windows,DispatchMessage才能结束执行
  • 窗口消息处理程序在处理消息过程中可给窗口消息处理程序发送另一条消息,这是窗口消息处理程序必须先处理第二条消息,第二条消息处理完毕后再继续处理第一条消息,如在窗口消息处理程序处理某一条消息时,调用UpdateWindow,将调用窗口消息处理程序处理WM_PAINT消息,窗口消息处理程序处理WM_PAINT结束以后,继续执行UpdateWindow,UpdateWindow结束以后继续处理最初那条消息
  • 窗口消息处理程序必须是可重入,即在窗口消息处理程序处理消息过程中,程序可能再次进入同一个窗口消息处理程序
原创粉丝点击