VC++ GetMessage与PeekMessage的区别

本文详细解析了Windows消息处理中的PeekMessage与GetMessage函数的区别与应用。PeekMessage用于检查是否有消息存在,而GetMessage则会阻塞直至获取到消息。文章通过对比两种函数的使用方式,阐述了在消息循环中的具体实现与注意事项。
摘要由CSDN通过智能技术生成

PeekMessage:   有消息返回true,没有消息返回false 。
GetMessage:     有消息且该消息不为WM_QUIT则返回true,有消息且该消息为WM_QUIT则返回false。

 

会堵塞等待消息,直到从程序的消息队列中取得消息。

PeekMessage不堵塞。

 

普通的消息循环GetMessage

while (GetMessage (&msg, NULL, 0, 0))       
{       
    TranslateMessage (&msg) ;       
    DispatchMessage (&msg) ;       
}      
return msg.wParam ;

等价于

while (TRUE)       
{        
    if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))        
    {        
       if (msg.message == WM_QUIT)        
          break ;        
       TranslateMessage (&msg) ;        
       DispatchMessage (&msg) ;        
    }        
    else        
    {        
       // 完成某些工作的其它行程序        
    }       
}       
return msg.wParam ;

注意,WM_QUIT消息被另外挑出来检查。在普通的消息循环中您不必这么作,因为如果GetMessage接收到一个WM_QUIT消息,它将传回0,但是PeekMessage用它的传回值来指示是否得到一个消息,所以需要对WM_QUIT进行检查。
如果PeekMessage的传回值为TRUE,则消息按通常方式进行处理。如果传回值为FALSE,则在将控制传回给Windows之前,还可以作一点工作(如显示另一个随机矩形)。
(尽管Windows文件上说,您不能用PeekMessage从消息队列中删除WM_PAINT消息,但是这并不是什么大不了的问题。毕竟,GetMessage并不从消息队列中删除WM_PAINT消息。从队列中删除WM_PAINT消息的唯一方法是令窗口显示区域的失效区域变得有效,这可以用ValidateRect和ValidateRgn或者BeginPaint和EndPaint对来完成。如果您在使用PeekMessage从队列中取出WM_PAINT消息后,同平常一样处理它,那么就不会有问题了。所不能作的是使用如下所示的程序代码来清除消息队列中的所有消息:
while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) ; 
这行叙述从消息队列中删除WM_PAINT之外的所有消息。如果队列中有一个WM_PAINT消息,程序就会永远地陷在while循环中。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值