转自 Maalvin 的一次论坛回帖
要想知道PeekMessage()和GetMessage()的区别,最简单的办法是在窗口函数拦截WM_PAINT的时候加一个永久循环,像 while(TRUE){},循环体中可以输出文本或图形。这时如果你使用GetMessage(),恐怕就会遇到麻烦,你的程序会什么都不做,如果鼠标 的光标恰好在窗口,你会发现它不是通常的箭头光标,而是沙漏--这意味着这个永久循环应占用了该程序的所有CPU资源,无法处理其他消息,比如,你无法结 束这个程序,也无法最小化。如果这个时候,你用PeekMessage()替换GetMessage(),将处理WM_PAINT的代码写成一个单独的函 数,这样,当消息队列中有消息要处理时让程序的TranslateMessage()和DispatchMessage()去处理消息,和 GetMessage()一样。当消息队列中没有消息时,调用你的函数,这样就完成了你想在WM_PAINT中想处理而无法处理的事情。而且从这个实验中 可以看到GetMessage()和PeekMessage()几个主要区别:
1。GetMessage()只有在接收到消息后才将控制权转给你的程序,而PeekMessage()无论有没有消息都会将控制权转给你的程序:如果有消息,返回真,没有消息返回假。
2。GetMessage()的主要功能是从消息队列中“取出”消息,消息被取出后,消息队列中就不再由该消息了;而PeekMessage()的主要功 能是“窥视(peek)”消息,如果有消息,返回真,没有返回假。但PeekMessage()允许你从消息队列中“取出”消息,这就是 PeekMessage()第四个函数的用途:如果选用PM_REMOVE,则消息从队列中取出,如选用PM_NOREMOVE,则 PeekMessage()则“文如其人”,只是“偷看”,而保留消息。
3。GetMessage()每次都“等待处理消息”而PeekMessage()只是“察看有无消息”。
和PeekMessage()相关的代码:
while (TRUE)
{
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break ;
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
else
{
//other program lines to do some work
}
}