PeekMessage 与 GetMessage

本文详细对比了PeekMessage与GetMessage两个Windows API函数的功能特性与应用场景。PeekMessage用于检查消息队列是否有消息,不论消息队列中是否有消息都会立即返回;GetMessage则会从消息队列中取出消息并删除,当队列为空时会阻塞等待。文中还解释了两种函数在处理WM_PAINT消息上的特殊行为。

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

当消息队列中存在消息时, PeekMessage就返回TRUE, 最后一个参数可以为:

PM_REMOVE
PM_NOREMOVE

表示是否在接收到消息的时候从消息队列中删除它们。
与GetMessage的不同:
PeekMessage只要有消息的时候, 这相依返回TRUE, 即使消息是WM_QUIT, 没有消息的时候, 它不会等待,而是立即返回,并返回FALSE。而GetMessage则是从消息队列中取出消息并删除它们, 当消息队列是空的时候,它会一直等待,直到队列中存在消息, 当收到WM_QUIT消息时, 它返回FALSE, 这是GetMessage惟一返回FALSE的情况, 其它都会返回TRUE, 代表一直等待或处理消息。
不管是PeekMessage还是GetMessage, 它们都不会删除WM_PAINT消息, 绝不会!!!从队列中删除WM_PAINT消息的情况是当显示区域重新变得有效的时候, 用ValidateRect和ValidateRgn或者BeginPaint和EndPaint来完成。
Peekmessage和Getmessage都是向系统的消息队列中取得消息,不过性质不同。
  若第一次向消息队列中取不到消息,则程序的主线程会被OS(操作系统)挂起;等到OS重新调度到该线程时,而且消息队列仍然是空的时,两者的性质不同:  
  若使用Getmessage(),则程序的主线程会仍被OS挂起。  
  若是用Peekmessage(),则程序会取得OS控制权,运行一段时间。此函数多用于处理系统的空闲时间。 
getmessage   and   peekmessage   are     both   get   the   message   from   send_message   queue.  
getmessage   supports     同步机制。PEEKMESSAGE   SUPPORTS   异步机制。 
从原因上而言:GetMessage函数从消息队列中得到消息后并在队列中删除该消息  
              PeekMessage函数从消息队列中得到消息后并不在队列中删除该消息  
从结果上而言:GetMessage等待一个消息(就像_getch),直到拿到消息才返回
              PeekMessage不是这样(就像_kbhit),查询消息队列,有就取,即使没有也立即返回。  
    
为了实现windows的多任务,要用getmessage,因为当getmessage发现自己的消息队列里没有消息时,就会把控制权交还给系统,这样就可以让避免资源的浪费。
GetMessage函数每次调用是肯定会取回一个消息的,当消息队列为空的时候此进程会被挂起直到消息队列中有消息可取为止。  
PeekMessage函数不管消息队列中是否有消息都会立即返回,返回是可以从返回的值里判断是否取到了消息,准确地说此函数是询问了一下消息队列,至于取回消息后是否从消息队列中删除此消息,由参数可以指定。  

  Windows3.1时很多应用程序的消息队列是由GetMessage函数构成的,而Win32以后大多数的应用程序的消息队列是由 PeekMessage函数构成的,vc和bcb好像都是这样的,基于Win32的抢先式多任务处理机制,采用PeekMessage函数构成的消息循环也不会对系统造成什么威胁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值