线程输入队列

时间:2011-12-26 19:11:24

标签: windows winapi

什么是“线程输入队列”?我已经在MSDN上看到它提到了几次,并且可以停止想知道它是否只是一个窗口的消息队列,它是由它们所代表的线程创建的,或者其他东西。

一个例子:

  

WH_MOUSE_LL挂钩使您可以监视鼠标输入事件   发布在线程输入队列

2 个答案:

答案 0 :(得分:2)

首先,请注意窗口没有单独的消息队列;窗口的消息存放在关联线程的消息队列中。

According to MSDN,键盘和鼠标输入消息被发送到与相关窗口关联的线程的消息队列。所以我认为“线程输入队列”只是说“线程消息队列”的另一种方式。

编辑:Raymond指出(请参阅注释)可以使用AttachThreadInput函数将输入重定向到不同线程的消息队列。因此,“线程输入队列”表示接收给定线程的任何消息队列;默认情况下,这是同一个线程的消息队列,但它可以是不同线程的消息队列。

答案 1 :(得分:0)

真正的答案比逻辑抽象offered by the MSDN稍微复杂一些。我可以比接受的答案的评论中所确认的更详细地回答。

是的,有两组消息。有一个“发布消息队列”和一个“输入消息队列”。后者包含原始鼠标和键盘消息事件的列表。前者包含已发布和合成的消息。

在内部,它们都只是列表,但输入消息列表包含在内部引用为“输入队列”的更大结构中。该结构包含有关逻辑队列的数据以及原始输入消息列表的指针。

它们也可以互换地分别称为“应用程序队列”和“系统队列”。

GetMessage()分别处理它们。

THREADINFO包含一个直接指向帖子消息列表/队列的指针。如果设置了QS_POSTMESSAGE,则会扫描此内容。

如果设置了QS_INPUTQS_EVENT队列状态,则通过从THREADINFO获取初始队列结构指针然后指向输入列表的指针来扫描输入列表/队列从该队列结构。很奇怪,我知道。

如果设置了QS_TIMER队列状态标志,GetMessage()(或PeekMessage())实际上必须启动完整非内核定时器列表的扫描才能找到最早的定时器警告状态“属于”任何叫GetMessage()的人。队列实际上并不存储有关哪个计时器触发的任何内容。它们只存储它们存储的相关信息QS_TIMER标志和触发的定时器数量(以便GetMessage()知道何时在合成消息后清除QS_TIMER队列状态最后一个触发的计时器可用。)

其他合成消息的工作方式类似,因为它们基于存储在实际队列消息列表之外的数据,但仍然“在”队列结构本身的其他数据中。