深入GetMessage和PeekMessage.docVIP

  • 11
  • 0
  • 约3.12万字
  • 约 44页
  • 2017-12-22 发布于河南
  • 举报
深入GetMessage和PeekMessage

深入GetMessage和PeekMessage 主题: 深入GetMessage和PeekMessage 译者的话 该文重点讲述了Windows处理事件、消息的具体过程和步骤。尤其是在系系处理鼠标键盘事件的过程上做了详解。通过这篇文章,你将对Windows的消息处理机制有一个较全面的了解。 概念 这篇文章解释了GetMessage和PeekMessage的内部运作方式,同时也是一类与“消息及消息在16位 MS-DOSreg;/Microsoftreg; Windows#8482;环境之下的影响”相关文章的基础。我们将讨论下面这些主题: ?系统和应用程序队列(译者注:以下简称为“程序队列”) ?GetMessage和PeekMessage函数 ?消息过滤 ?WM_QUIT消息 ?让步和休眠 ?让步的问题 ?WaitMessage 16位MS-DOS/Windows环境和32位Win32#8482;/Windows NT#8482;环境有些很重要的不同之处。虽然这些不同之处在这儿无法被忽视,但我们还是把它们做为遗留问题,由以后的文章去解释吧。 队列 要理解GetMessage和PeekMessage的运作,必须首先明白Microsoftreg; Windows#8482;操作系统是如何储存事件和消息的。在Windows中有两种类型的队列为此目的工作,它们分别是系统队列和消息队列。 硬件输入:系统队列 Windows有一些驱动程序,它们负责响应来自于键盘和鼠标等硬件的中断服务。在中断时间中,键盘和鼠标驱动程序会调用USER.EXE中指定的一些入口点去报告一个事件的发生。在Windows中服务于光笔计算的光笔驱动程序,同样会在原始的光笔事件中调用这些入口点。 在Windows3.1中,系统队列是一个有着120个入口空间的定长的队列。在一般情形下这些“小房间”是足够了,但如果应用程序挂起了或者在一段长的时间里没有及时处理任何消息就可能导致系统队列被填满。如果真的发生了,任何尝试添加到系统队列的新事件都将会引起系统蜂鸣。(译者注:在DOS中,如果一个程序在一段时间内占用了所有的系统资源,使机器无法响应,这时如果你按住一个键不放,你就会听到机箱喇叭嘀嘀作响) 发送的消息和程序队列 当一个应用程序开始时,一个队列将会因此而被创建。程序队列(有时会称为任务队列)常常用于储存“正在被发往应用程序的一个窗口” 的消息。唯一常驻程序队列的消息是那???由PostMessage或PostAppMessage明确发送的消息。(SendMessage从不使用系统队列)PostQuitMessage函数不会发送一个消息到程序队列。(WM_QUIT消息将在下文中论讨) 默认的,每个程序队列可以保持八个消息。一般情况下这是相当足够的,因为PostMessage极少被使用。但是如果一个应用程序试图强制调用很多的PostMessage到某个应用程序时,那么这类应用程序将会用使用SetMessageQueue函数来增加消息队列的长度。你必须小心的使用SetMessageQueue函数,因为它无论何时都会先删掉当前的程序队列,并创建一个预期大小的新队列,此时任何在旧队列中的消息都会被销毁。因此,它必须在你的WinMain例程中在所有其它的应用程序编程接口(API)之前调用或在应用程序用PeekMessage明确的清除队列之后调用。 GetMessage和PeekMessage是怎样工作的 在Windows的内部,GetMessage和PeekMessage执行着相同的代码。而两者最大的不同之处则体现在没有任何消息返回到应用程序的情况下。在此种情况下,PeekMessage会返回一个空值到应用程序,GetMessage会在此时让应用程序休眠。在它们之间还有一些其它的不同,我们将会在下面讨论,但它们相当次要。 GetMessage和PeekMessage逻辑 下面一步步的讲述了在Windows3.1版的GetMessage和PeekMessage公用代码。 提示:下面所示步骤按照消息类型的优先权进行排序。举个例子,发送的消息总在键盘和鼠标消息之前被返回,而键盘和鼠标的消息又会在绘图(paint)消息之前反回,以此类推。 1. 检视在为“活动中任务”服务的程序队列中是否有消息的存在。如果是,首先在队首删除此消息并将其返回到应用程序。然后,应用程序中的GetMessage和PeekMessage会调用一些代码,用以从程序队列中接收此消息,这些代码是由该应用程序调用的动态链接库(DLL)生成的。记住,只有由PostMessage发送的消息会常驻于此队列中。 2. 与所有消息和窗体句柄过滤器进行对照,核查此消息。如

文档评论(0)

1亿VIP精品文档

相关文档