- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
GetMessage和PeekMessage
GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)
PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax,UINT wRemoveMsg)
参数wRemoveMsg的作用是指定消息获取的方式,如果设为PM_NOREMOVE,那么消息将不会从消息队列中被移出,如果设为PM_REMOVE,那么消息将会从消息队列中被移出;
两个函数主要有以下两个区别: 1.GetMessage将等到有合适的消息时才返回,而PeekMessage只是撇一下消息队列。 2.GetMessage会将消息从队列中删除,而PeekMessage可以设置最后一个参数wRemoveMsg来决定是否将消息保留在队列中。
在Windows的内部,GetMessage和PeekMessage执行着相同的代码。而两者最大的不同之处则体现在没有任何消息返回到应用程序的情况下。在此种情况下,PeekMessage会返回一个空值到应用程序,GetMessage会在此时让应用程序休眠。
如果消息队列里没有消息的时候不让Getmassage在Windows内部等待,就是说想充分利用程序的所有时间,就应该用peekmassage
peekmessage是一个类似于Getmessage的函数,区别在于当消息队列里有消息的时候,Peekmessage取回消息,并在eax中返回非零值,没有消息的时候它会直接返回,并在eax中返回零.
所以在返回非零值的时候,程序检查消息是否是WM_QUIT,是则结束消息循环,不是则用标准流程处理消息;返回零的时候,表示是空闲时间,程序就可以做其他工作了,但插入做其他工作的代码执行时间不能太长,以不超过10ms为好,否则会影响正常的消息处理,使窗口的反应看起来很迟钝.如果必须处理很长时间的工作,那么应该将它们分成很多小部分处理,以便有足够频率用Peekmessage来检查消息.
peekmassage 比 Getmassage 多一个参数.这个参数表示在取回消息以后,对消息队列中的消息是否保留.当这个参数是PM_REMOVE时,消息被取回的同时也被从消息队列里删除,而用PM_NOREMOVE的时候,被取回的消息不会从消息队列中删除,函数相当于偷看了这条消息.
译者的话
该文重点讲述了Windows处理事件、消息的具体过程和步骤。尤其是在系系处理鼠标键盘事件的过程上做了详解。通过这篇文章,你将对Windows的消息处理机制有一个较全面的了解。
概念
这篇文章解释了GetMessage和PeekMessage的内部运作方式,同时也是一类与“消息及消息在16位 MS-DOS?/Microsoft? Windows?环境之下的影响”相关文章的基础。我们将讨论下面这些主题:
·系统和应用程序队列(译者注:以下简称为“程序队列”)
·GetMessage和PeekMessage函数
·消息过滤
·WM_QUIT消息
·让步和休眠
·让步的问题
·WaitMessage
16位MS-DOS/Windows环境和32位Win32?/Windows NT?环境有些很重要的不同之处。虽然这些不同之处在这儿无法被忽视,但我们还是把它们做为遗留问题,由以后的文章去解释吧。
队列
要理解GetMessage和PeekMessage的运作,必须首先明白Microsoft? Windows?操作系统是如何储存事件和消息的。在Windows中有两种类型的队列为此目的工作,它们分别是系统队列和消息队列。
硬件输入:系统队列
Windows有一些驱动程序,它们负责响应来自于键盘和鼠标等硬件的中断服务。在中断时间中,键盘和鼠标驱动程序会调用USER.EXE中指定的一些入口点去报告一个事件的发生。在Windows中服务于光笔计算的光笔驱动程序,同样会在原始的光笔事件中调用这些入口点。
在Windows3.1中,系统队列是一个有着120个入口空间的定长的队列。在一般情形下这些“小房间”是足够了,但如果应用程序挂起了或者在一段长的时间里没有及时处理任何消息就可能导致系统队列被填满。如果真的发生了,任何尝试添加到系统队列的新事件都将会引起系统蜂鸣。(译者注:在DOS中,如果一个程序在一段时间内占用了所有的系统资源,使机器无法响应,这时如果你按住一个键不放,你就会听到机箱喇叭嘀嘀作响)
发送的消息和程序队列
当一个应用程序开始时,一个队列将会因此而被创建。程序队列(有时会称为任务队列)常常用于储存“正在被发往应用程序的一个窗口
您可能关注的文档
- Avtztym2010年6月英语四级听力原文.doc
- az-omrqs日语成语.doc
- Audi A1.保险丝.doc
- AZO前处理小结.doc
- A危险源安全防范措施和监控措施.doc
- A合生创展集团有限公司人力资源管理办法.doc
- A建材超市背景简介.doc
- A实验一 光学显微镜的使用方法及细胞结构.ppt
- a桩间土开挖,破桩头施工方案1.doc
- A渠道进驻规划(成都).ppt
- 福莱特玻璃集团股份有限公司海外监管公告 - 福莱特玻璃集团股份有限公司2024年度环境、社会及管治报告.pdf
- 广哈通信:2024年度环境、社会及治理(ESG)报告.pdf
- 招商证券股份有限公司招商证券2024年度环境、社会及管治报告.pdf
- 宏信建设发展有限公司2024 可持续发展暨环境、社会及管治(ESG)报告.pdf
- 品创控股有限公司环境、社会及管治报告 2024.pdf
- 中信建投证券股份有限公司2024可持续发展暨环境、社会及管治报告.pdf
- 洛阳栾川钼业集团股份有限公司环境、社会及管治报告.pdf
- 361度国际有限公司二零二四年环境、社会及管治报告.pdf
- 中国神华能源股份有限公司2024年度环境、社会及管治报告.pdf
- 广西能源:2024年环境、社会及治理(ESG)报告.pdf
文档评论(0)