1、 首先PostMessage是异步消息投放,SendMessage是同步消息投放
函数原型:
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
同步投放的SendMessage函数并不讲消息放到消息队列中,而是直接为制定窗口调用函数处理函数,待消息处理函数完成处理后,并将消息处理函数的结果返回。
函数原型:
B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
异步投放意味着postMessage将消息投放至消息队列后,立即返回,只返回状态标明消息是否顺利投放到消息队列中。
* 使用 postMessage可以避免程序死锁
* 不能使用postMessage大量发送同一消息,由于消息队列空间有限,大量发送同一消息又得不到及时处理,会导致队列中未处理的消息被丢弃
* 如果消息是程序必须处理,而又有可能导致程序卡死,则使用SendMessageTimeout。
2、对于peekMessage和getMessage
函数原型:
B00L PeekMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax,
UINT wRemoveMsg
);
PeekMessage 从获取消息后返回得到的消息数,若返回0标明消息队列中没有消息,并将控制器返回给主函数;
而GetMessage在没有获得消息时,将函数挂起、
while (TRUE)
{
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break ;
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
else
{
// 完成某些工作的其它行程序
}
}
return msg.wParam ;