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

前言

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

函数原型

GetMessage()

BOOL GetMessage(
  LPMSG lpMsg,
  HWND  hWnd,
  UINT  wMsgFilterMin,
  UINT  wMsgFilterMax
);
  • lpMsg 为接收消息信息的 MSG 结构的指针,负责存储抓到的消息。
  • hWnd 为抓取消息的窗口句柄,窗口必须属于当前线程,若此值为 0 则抓取当前线程内所有窗口的消息
  • wMsgFilterMin 为抓取的最小消息 id
  • wMsgFilterMax 为抓取的最大消息 id,若 MinMax 皆为 0 则抓取所有消息

PeekMessage()

BOOL PeekMessageA(
  LPMSG lpMsg,
  HWND  hWnd,
  UINT  wMsgFilterMin,
  UINT  wMsgFilterMax,
  UINT  wRemoveMsg
);
  • lpMsg 为接收消息信息的 MSG 结构的指针,负责存储抓到的消息。
  • hWnd 为抓取消息的窗口句柄,窗口必须属于当前线程,若此值为 0 则抓取当前线程内所有窗口的消息
  • wMsgFilterMin 为抓取的最小消息 id
  • wMsgFilterMax 为抓取的最大消息 id,若 MinMax 皆为 0 则抓取所有消息
  • 处理消息的方式,例如移除 (PM_REMOVE) 或不移除 (PM_REMOVE)

返回值

GetMessage()

  • 当有消息,且消息不为 WM_QUIT 时,返回 1
  • 当有消息,且消息为 WM_QUIT 时,返回 0
  • 当出现异常时,返回-1,例如 hWndlpMsg 无效 (bool 居然可以返回-1, 好神奇)

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

PeekMessage()

  • 当有消息时,返回 TRUE
  • 当没有消息时,返回 FALSE

异同分析

相同点

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

不同点

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

总结

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

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

当然二者都有各自的应用场景,并不是说 PeekMessage 就一定比 GetMessage 更好用。除了上述内容外也有其他细节的差异,个人水平有限就先不赘述了


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

本文作者:小小黑
本文链接:https://lonelyenderman.top/archives/899
版权声明:本站采用 BY-NC-SA 进行许可。转载请注明出处!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(*^▽^*)
 ̄﹃ ̄
(╯‵□′)╯︵┴─┴
(~ ̄▽ ̄)~
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
( ͡° ͜ʖ ͡°)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
つ﹏⊂
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
(´▽`ʃ♡ƪ)
w(゚Д゚)w
(๑•̀ㅂ•́)و✧
(#`O′)
凸 (艹皿艹 )
o(≧口≦)o
≡ω≡
(*/ω\*)
○| ̄|_
(⊙ˍ⊙)
Σ(っ °Д °;)っ
o( ̄ヘ ̄o#)
<( ̄︶ ̄)>
(。・∀・)ノ゙
(o゜▽゜)o☆
╥﹏╥
ヾ(´・ω・`)ノ
😂
😀
😅
😊
🙂
😍
😘
😜
😝
😏
😒
🙄
😳
😔
😫
😱
😭
😶
🌚
😣
🤨
😣
🤐
😪
🤤
🥵
🤮
😨
😱
😓
🤬
👴
🤡
🙈
💊
🙏
🤺
💩
👻
🙌
🖕
👍
👫
👌
🙏
👀
🐒
🔪
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Source: github.com/zhheo/Sticker-Heo
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
Heo
花!
上一篇
下一篇