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☆
╥﹏╥
ヾ(´・ω・`)ノ
😂
😀
😅
😊
🙂
😍
😘
😜
😝
😏
😒
🙄
😳
😔
😫
😱
😭
😶
🌚
😣
🤨
😣
🤐
😪
🤤
🥵
🤮
😨
😱
😓
🤬
👴
🤡
🙈
💊
🙏
🤺
💩
👻
🙌
🖕
👍
👫
👌
🙏
👀
🐒
🔪
Source: github.com/zhheo/Sticker-Heo
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
Heo
花!
上一篇