GetMessage与PeekMessage(16位windows程序)

 GetMessage与PeekMessage在windows的内部执行相同的代码,当应用程序的消息队列里没有消息的时候,GetMessage会使线程sleep,而PeekMessage会返回到应用程序,返回值为NULL。

 

 GetMessage与PeekMessage执行流程:

1,检查应用程序的消息队列,如果有就从队列头移除此消息,并把它返回给应用程序。

2,检查消息和窗体过滤,GetMessage(msg, hwnd, filtermin, filtermax)

3,如果应用程序队列中没有消息,那么就会扫描system events queue。如果在system events queue队列头的事件正是给应用程序的,那么就把它转化成消息传给应用程序(注意,并没有把转换后的消息放到消息队列中去)。扫描系统事件队列的过程会迫使当前线程交出控制权给其它线程。

4,如果系统时间队列中没有满足条件的,GetMessage或PeekMessage会检查当前程序的窗口,看看有没有需要重绘的。如果有,产生一个WM_PAINT消息(不会放入消息队列),返回给应用程序。应用程序会持续收到WM_PAINT消息,直到要更新的区域使用BeginPaint/EndPaint,ValidateRect或ValidateRgn。

5,如果没有窗口需要更新,GetMessage和PeekMessage会交出控制权,除非PeekMessage使用PM_NOYIELD选项。

6,当重返GetMessage和PeekMessage时候,程序会检查有没有timer对象已经到期,如果有就产生WM_TIMER,并返回。

8,执行到这一步,要么已经得到一个有效的MSG,要么没有消息要处理。

PeekMessage和GetMessage在这一步处理不同

如果PeekMessage用PM_NOYIELD参数调用,PeekMessage会交出控制权,并返回Null给应用程序。如果pm_noyield没有指定,程序此时没有sleep,但其它线程会执行,当yield返回时候,PeekMessage返回Null值。

GetMessage这时候会把程序sleep,直到一些事件发生需要程序处理。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值