(1)GetMessage () and PeekMessage ()
他们的函数原型如下:
BOOL GetMessage (
LPMSG lpMsg, // pointer to structure for message
HWND hWnd, // handle to window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax ) // last message
BOOL PeekMessage (
LPMSG lpMsg, // pointer to structure for message
HWND hWnd, // handle to window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax, // last message
UINT wRemoveMsg ); // removal flags
GetMessage 其唯一用途就是从事件对列中获得消息,并进行处理。当程序在等待通过 GetMessage 传递的消息时,主事件循坏基本上是锁定的。如果消息队列中没有消息,则GetMessage()不会返回,一直等待。即是同步的。
那么,如果我们要处理实时的事件循环该怎么办呢?Windows 为我们提供了另一个函数 PeekMessage,他们的原型几乎是一样的,唯一的不同是 PeekMessage 比 GetMessage 多了一个参数:UINT wRemoveMsg // removal flags。对于wRemoveMsg ,有效的标志有:
PM_NOREMOVE,PeekMessage 处理之后,消息没有从序列中去除;
PM_REMOVE,PeekMessage 处理之后,消息已经从序列中去除;
通过利用PeekMessage 来判断消息序列中是否有消息,如果有,就处理它;否则继续处理其他的逻辑。
(2)SendMessage () and PostMessage ()
LRESULT SendMessage (
HWND hWnd, // handle of destination windonw
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam); // second message parameter
BOOL PostMessage (
HWND hWnd, // handle of destination windonw
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam); // second message parameter
SendMessage 向窗口传递一个要求立即处理的消息。接收窗口处理完该消息后,该函数便紧接着 WinProc 返回,是同步的。
PostMessage 将消息发往窗口的消息序列,而后直接返回。是异步的。
(3)所以从同步异步来看,GetMessage 和SendMessage 是一对,PeekMessage 与PostMessage 是一对。
参考原文:http://www.cnblogs.com/chio/archive/2007/08/02/840562.html