鱼C论坛

 找回密码
 立即注册
查看: 17539|回复: 14

[API档案] GetMessage

[复制链接]
发表于 2014-5-16 22:04:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
函数功能:

GetMessage 函数的作用是从当前线程的消息队列里获取一个消息并填入 MSG 结构 中。

该函数只能获取调用线程的消息,不能获得其他线程的消息。成功获取消息后,线程将从消息队列中删除该消息。

使用 GetMessage 函数,如果消息队列为空,函数会一直等待直到有消息到来才有返回值。如果希望函数立刻返回(无论是否获取消息),请使用 PeekMessage 函数。


API 函数原型:

  1. BOOL WINAPI GetMessage(
  2.   _Out_     LPMSG lpMsg,
  3.   _In_opt_  HWND hWnd,
  4.   _In_      UINT wMsgFilterMin,
  5.   _In_      UINT wMsgFilterMax
  6. );
复制代码


参数解析:

参数 含义
lpMsg 指向 MSG 结构的指针,用于存放获取到的消息
hWnd 1. 需要获取消息的窗口的句柄,该窗口必须属于当前线程
2. 当其值是 NULL 时,将获取所有的当前线程的窗口消息和线程消息
3. 当其值是 -1 时,只获取当前线程消息
wMsgFilterMin 指定被可以被获取的消息值的最小整数(消息其实就是一个被定义的整数)
wMsgFilterMax 指定被可以被获取的消息值的最小整数


返回值:

1. 如果函数取得 WM_QUIT 之外的其他消息,返回值是非 0;

2. 如果函数取得 WM_QUIT 消息,返回值是 0;

3. 如果出现了错误,返回值是 -1。


备注:

1. 应用程序通常根据 GetMessage 函数的返回值决定是否结束消息循环并退出程序;

2. 如果 hWnd 参数不为零,则 GetMessage 函数只获取属于 hWnd 窗口的消息,以及被 IsChild 函数确定为 hWnd 的子窗口的消息;

3. wMsgFilterMin 和 wMsgFilterMax 参数限定消息获取的范围,如果二者都为 0,则消息获取的范围为所有消息;

4. 注意,即便你通过 wMsgFilterMin 和 wMsgFilterMax 参数限定消息获取的范围,但 WM_QUIT 不受此范围影响(无法阻止此消息被 PeekMessage 函数获取);

5. 调用此函数的过程中,如果接收到非排队消息 —— 也就是由该线程调用 SendMessage, SendMessageCallback, SendMessageTimeout, 或 SendNotifyMessage 发送给所属窗口的消息 —— 系统先暂时挂起等待,然后再获取过滤器匹配的第一个队列消息。如果不指定过滤器,那么按照以下顺序获取消息:

  • Sent messages
  • Posted messages
  • Input (hardware) messages and system internal events
  • Sent messages (again)
  • WM_PAINT messages
  • WM_TIMER messages

6. PeekMessage 函数通常不会从消息队列中删除 WM_PAINT 消息,WM_PAINT 会持续保留在消息队列中直到它们被处理,除非一个 WM_PAINT 消息指定的区域为 NULL。

小甲鱼注释:大家应该还记得有三个消息 WM_QUIT, WM_PAINT, WM_TIMER 会被特殊处理,它们总是放在队列的最后面,直到没有其它消息的时候才被处理,连续的 WM_PAINT 消息将被合并成一个以提高绘图效率。

7. 如果一个顶层窗口停止响应的消息超过几秒钟,系统认为窗口没有响应,并使用一个备用窗口替代,该窗口具有相同的 Z 序列、位置、尺寸和视觉属性。这使得用户可以移动、调整大小,甚至关闭该应用程序。然而,这些仅仅是动作,现有的程序事实上仍然没有响应(为了提高用户体验而制作的假象)。当一个程序被调试时,系统并不会为其生成备用窗口。

【API档案】版权归鱼C工作室(www.fishc.com)所有,转载请注明来源。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-16 23:17:59 | 显示全部楼层
来抢沙发{:7_174:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2014-5-16 23:35:37 | 显示全部楼层
今天又一次听了小甲鱼老师的003的视频,敲了两遍代码,的确感觉那代码的确是不好敲呀,容易出错。听老师的,初学者至少敲5遍,明天继续敲3遍

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 3 反对 0

使用道具 举报

发表于 2014-5-18 14:07:52 | 显示全部楼层
xqlsrjjjh 发表于 2014-5-16 23:35
今天又一次听了小甲鱼老师的003的视频,敲了两遍代码,的确感觉那代码的确是不好敲呀,容易出错。听老师的, ...

装个Visual Assistant吧,都有提示,不用记:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2014-5-18 16:23:41 | 显示全部楼层
myisland 发表于 2014-5-18 14:07
装个Visual Assistant吧,都有提示,不用记

呵呵,这个好,不过初学者还是多敲敲代码好{:7_148:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2014-8-6 00:00:23 | 显示全部楼层
xqlsrjjjh 发表于 2014-5-16 23:35
今天又一次听了小甲鱼老师的003的视频,敲了两遍代码,的确感觉那代码的确是不好敲呀,容易出错。听老师的 ...

真的特别难敲
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-26 09:37:47 | 显示全部楼层
挑错:wMsgFilterMax应该是“指定可以被获取的消息值的最大整数”吧

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
威斯布鲁特 + 1 + 1 + 1 指出错误

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-10-20 08:40:54 | 显示全部楼层
原来如此,GetMessage中的参数设置是获取所有线程的窗口消息和线程消息,谢谢分享
不过还是不很明白 非队列消息和队列消息同时到达时的处理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-20 08:42:44 | 显示全部楼层
哦,也就是说如果GetMessage遇到了非队列消息,那么就优先处理非队列消息,把队列消息晾在一边,非队列消息处理完了,再继续处理队列消息么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-20 12:11:07 | 显示全部楼层
看来要好好挑代码了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-14 13:57:34 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-6 13:32:45 | 显示全部楼层
路过学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-16 18:19:15 | 显示全部楼层
wMsgFilterMax
指定被可以被获取的消息值的最小整数
(最小整数 ——— 有问题啊  )
max 最大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-11 15:29:37 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-15 11:36:09 | 显示全部楼层
wMsgFilterMax        指定被可以被获取的消息值的最小整数
我觉得这个应该是最大整数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 17:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表