Windows message queue state log

Windows中关于消息队列的说明。
   消息队列归属于线程所有。消息队列有不同的标志:
 标志                队列中的消息
QS_KEY            WM_KEYUP WM_KEYDOWN WM_SYSKEYUP WM_SYSKEYDOWN
QS_MOUSEMOVE      WM_MOUSSEMOVE
QS_MOUSEBUTTON    WM_?BUTTON*
QS_MOUSE          同QS_MOUSEMOVE|QS_MOUSEBUTTON
QS_INPUT          同QS_MOUSE|QS_KEY
QS_PAINT          WM_PAINT
QS_TIMER          WM_TIMER
QS_HOTKEY         WM_HOTKEY
QS_POSTMESSAGE    登记的消息(不同于硬件输入事件)。当队列在期望的消息过滤器范围内没有登记的消   息时,这个标志要消除。除此之外,这个标志与QS_ALLPOSTMESSAGE相同
QS_ALLPOSTMESSAGE 登记的消息(不同于硬件输入事件)。当队列完全没有登记的消息时(在任何消息过滤器范围),这个标志要消除。除此之外,这个标志与QS_POSTMESSAGE相同
QS_ALLEVENTS      同QS_INPUT|QS_POSTMESSAGE|QS_TIMER|QS_PAINT|QS_HOTKEY
QS_QUIT           已调用PostQuitMessage。注意这个标志没有公开,所以在WinUser.h文件中没有。它由系统在内部使用
QS_SENDMESSAGE    由另一个线程发送的消息
QS_ALLINPUT       同QS_ALLEVNETS|QS_SENDMESSAGE

     不是所有的唤醒标志都由系统平等对待。对于QS_MOUSEMOVE标志,只要队列中存在一个未处理QS_MOUSEMOVE消息,这个标志就要被设置。当GetMessage或PeekMessage (利用PM_REMOVE)从队列

中放入新的QS_MOUSEMOVE消息之前,这个标志被关闭。QS_KEY、QS_MOUSEBUTTON和QS_HOTKEY 标志都根据相应的消息按与此相同的方式处理。
     QS_PAINT标志的处理与此不同。如果线程建立的一个窗口有无效的区域,QS_PAINT标志被设置。当这个线程建立的所有窗口所占据的区域变成无效时(通常由于对ValidateRect、ValidateRegion或BeginPaint的调用而引起),QS_PAINT标志就被关闭。只有当线程建立的所有窗口都无效时,这个标志才关闭。调用GetMessage或PeekMessage对这个唤醒标志没有影响。
     当线程的登记消息队列中至少有一个消息时,QS_POSTMESSAGE标志就被设置。这不包括线程的虚拟输入队列中的硬件事件消息。当线程的登记消息队列中的所有消息都已经处理,队列变空时,这个标志被复位。
     每当一个定时器(由线程所建立)报时(go off),QS_TIMER标志就被设置。在GetMessage或PeekMessage返回QS_TIMER事件之后,QS_TIMER标志被复位,直到定时器再次报时。
     QS_SENDMESSAGE标志指出有一个消息在线程的发送消息队中。系统在内部使用这个标志,用来确认和处理线程之间发送的消息。对于一个线程向自身发送的消息,不设置这个标志。虽然可以使用QS_SENDMESSAGE标志,但很少需要这样做。笔者还从未见到一个程序使用这个标志。
     还有一个未公开的队列状态标志QS_QUIT。当一个线程调用PostQuitMessage时,QS_QUIT标志就被设置。系统并不实际向线程的消息队列追加一个QS_QUIT消息。GetQueueStatus函数也不返回这个标志的状态。

    从线程的队列中提取消息的算法:
    当一个线程调用GetMessage或PeekMessage时,系统必须检查线程的队列状态标志的情况,并确定应该处理哪个消息。下面叙述的步骤说明了系统是如何确定线程应该处理的下一个消息的情况。
1) 如果QS_SENDMESSAGE标志被设置,系统向相应的窗口过程发送消息。GetMessage或PeekMessage函数在内部进行这种处理,并且在窗口过程处理完消息之后不返回到线程,这些函数要等待其他要处理的消息。
2) 如果消息在线程的登记消息队列中,函数GetMessage或PeekMessage填充传递给它们的MSG结构,然后函数返回。这时,线程的消息循环通常调用DispatchMessage,让相应的窗口过程来处理消息。
3) 如果QS_QUIT标志被设置。GetMessage或PeekMessage返回一个WM_QUIT消息(其中wParam参数是规定的退出代码)并复位QS_QUIT标志。
4) 如果消息在线程的虚拟输入队列,函数GetMessage或PeekMessage返回硬件输入消息。
5) 如果QS_PAINT标志被设置,GetMessage或PeekMessage为相应的窗口返回一个WM_PAINT消息。
6) 如果QS_TIMER 标志被设置,GetMessage或PeekMessage返回一个WM_TIMER消息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值