排队信息

【勇芳软件工作室】汉化HomePreviousNext

Windows可以一次显示任意数量的窗口。要将鼠标和键盘输入路由到适当的窗口,Windows将使用消息队列。

Windows维护单个系统消息队列和任意数量的线程消息队列,每个GUI线程一个。为了避免为非GUI线程创建消息队列的开销,最初创建所有线程,而没有消息队列。只有当线程首次调用其中一个Win32 API User或GDI函数时,系统才会创建一个线程的消息队列。

每当用户移动鼠标时,单击鼠标按钮或键盘上的类型,鼠标或键盘的设备驱动程序将输入转换为消息并将其放置在系统消息队列中。Windows从系统消息队列中删除一个消息,检查它们以确定目标窗口,然后将其发布到创建目标窗口的线程的消息队列中。线程的消息队列接收线程创建的窗口的所有鼠标和键盘消息。线程从其队列中移除消息,并引导Windows将其发送到相应的窗口过程进行处理。

除了WM_PAINT消息外,Windows总是在消息队列的末尾发布消息。这确保窗口以适当的先入先出(FIFO)序列接收其输入消息。然而,WM_PAINT消息被保留在队列中,并且只有当队列不包含其他消息时才被转发到窗口过程。将同一窗口的多个WM_PAINT消息组合成单个WM_PAINT消息,将客户区域的所有无效部分合并到单个区域。组合WM_PAINT消息可减少窗口必须重绘其客户区内容的次数。

系统通过填写MSG结构然后将其复制到消息队列,将消息发布到线程的消息队列。MSG中的信息包括:消息所针对的窗口的句柄,消息标识符,两个消息参数,消息发布的时间以及鼠标光标位置。线程可以使用PostMessagePostThreadMessage功能将消息发布到自己的消息队列或另一个线程的队列。

应用程序可以使用GetMessage功能从其队列中删除消息。要检查消息而不将其从队列中删除,应用程序可以使用PeekMessage功能。此函数填充MSG有关该消息的信息。

从队列中删除消息后,应用程序可以使用DispatchMessage函数来指示Windows将消息发送到窗口过程进行处理。DispatchMessage会使用PeekMessagePeekMessage功能先前拨打的MSG指针。DispatchMessage将窗口句柄,消息标识符和两个消息参数传递给窗口过程,但不会通过消息发布的时间或鼠标光标位置。应用程序可以在处理消息时调用GetMessageTimeGetMessagePos功能来检索此信息。

当线程在其消息队列中没有消息时,线程可以使用WaitMessage函数来控制其他线程。该函数暂停线程,直到新消息被放置在线程的消息队列中才返回。

您可以调用SetMessageExtraInfo函数将32位值与当前线程的消息队列相关联。然后调用GetMessageExtraInfo函数获取与GetMessagePeekMessage功能检索到的最后一条消息相关联的值。