首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

GetMessage()与PeekMessage()的区别(Win32)

前言

众所周知(bushi),Windows的所有程序都是由消息驱动的,每个程序都有自己的消息队列,通过处理各种各样的消息来完成一系列操作,从消息队列中抓取消息的常用函数有两个,分别是与,单从字面意思其实并不容易看出这两个函数的区别,今天刚好有空就来记录一下。

函数原型

GetMessage

BOOL GetMessage(

LPMSG lpMsg,

HWND hWnd,

UINT wMsgFilterMin,

UINT wMsgFilterMax

);

为接收消息信息的MSG结构的指针,负责存储抓到的消息。

为抓取消息的窗口句柄,窗口必须属于当前线程,若此值为0则抓取当前线程内所有窗口的消息

为抓取的最小消息id

为抓取的最大消息id,若与皆为则抓取所有消息

PeekMessage

BOOL PeekMessageA(

LPMSG lpMsg,

HWND hWnd,

UINT wMsgFilterMin,

UINT wMsgFilterMax,

UINT wRemoveMsg

);

为接收消息信息的MSG结构的指针,负责存储抓到的消息。

为抓取消息的窗口句柄,窗口必须属于当前线程,若此值为则抓取当前线程内所有窗口的消息

为抓取的最小消息id

为抓取的最大消息id,若与皆为则抓取所有消息

处理消息的方式,例如移除()或不移除()

返回值

GetMessage:

当有消息,且消息不为时,返回

当有消息,且消息为时,返回

当出现异常时,返回,例如或无效(bool居然可以返回-1,好神奇)

因为有三种返回值,所以应尽量避免的写法

PeekMessage:

当有消息时,返回

当没有消息时,返回

异同分析

相同点

二者都可以将消息抓出来并存储到中

不同点

只有在有消息时才会返回真值,若当前程序消息队列中没有消息,则会一直等待,此时线程处于阻塞状态,应用程序将无法执行任何指令。而不管有没有消息都会返回一个值,线程不会进入阻塞状态,应用程序可以不受影响执行其他指令

总结

通过上述对比不难看出,明显要比更加灵活,可以在不影响线程的情况下抓取消息。如果在抓取窗口消息的同时又不想让程序进入阻塞状态,就应该使用。

如果把二者类比为人,那就是死心眼儿,不抓到消息绝不返回(异常情况除外)。而则相当机灵,针对两种情况都有不同的处理方式(有点像是侦察兵)。

当然二者都有各自的应用场景,并不是说就一定比更好用。而且除了我说的几方面外也有其他细节的差异,个人水平有限就先不赘述了

参考文章:https://blog.csdn.net/m0_43458204/article/details/107979435

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230405A06MPJ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券