笔记_postMessage/sendMessage/getMessage/peekMessage

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, 00, PM_REMOVE))        
     {        
            
if (msg.message == WM_QUIT)        
                   
break ;        
            TranslateMessage (
&msg) ;        
            DispatchMessage (
&msg) ;        
    }        
    
else        
    {        
            
// 完成某些工作的其它行程序        
    }       
}       
return msg.wParam ;

你可能感兴趣的:(编程练习)