笔记_postMessage/sendMessage/getMessage/peekMessage

本文介绍了Windows消息处理中的PostMessage与SendMessage的区别,包括它们如何处理消息以及在何时使用更合适。同时,还探讨了peekMessage与getMessage的功能及使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值