什么是“线程input队列”? 我已经在MSDN上看到了它的几次提到,并且可以停止想知道它是否仅仅是窗口的消息队列,是由它们所表示的线程创build的,还是其他的东西。
一个例子:
WH_MOUSE_LL钩子使您能够监视要在线程input队列中发布的鼠标input事件。
首先,注意窗口没有单独的消息队列; 窗口的消息被存入关联线程的消息队列中。
根据MSDN ,键盘和鼠标输入消息被发送到与相关窗口相关联的线程的消息队列。 所以我相信“线程输入队列”就是说“线程消息队列”的另一种方式。
编辑:雷蒙德指出(见注释)可以使用AttachThreadInput函数将输入重定向到不同线程的消息队列。 所以,“线程输入队列”是指哪个消息队列正在接收给定线程的输入; 默认情况下,这是同一个线程的消息队列,但它可以是另一个线程的消息队列。
真正的答案比MSDN提供的逻辑抽象稍微复杂一些。 我可以比接受答复的评论中已经确认的更详细地回答。
是的,有两组消息。 有一个“邮件消息队列”和一个“输入消息队列”。 后者包含原始鼠标和键盘消息事件的列表。 前者包含张贴和合成的消息。
在内部,它们都只是列表,但是输入消息列表被包含在内部被称为“输入队列”的较大结构中。 该结构包含关于逻辑队列的数据加上原始输入消息列表的指针。
它们也可以互换地分别称为“应用程序队列”和“系统队列”。
GetMessage()
处理它们。
THREADINFO
包含一个直接指向邮件列表/队列的指针。 如果设置了QS_POSTMESSAGE
则会扫描这个信息。
如果设置了QS_INPUT
或QS_EVENT
队列状态,则通过从QS_INPUT
获取初始队列结构指针,然后从该队列结构获取输入列表指针来扫描输入列表/队列。 奇怪,我知道。
如果设置了QS_TIMER
队列状态标志,则GetMessage()
(或PeekMessage()
)实际上必须启动对完整的非内核定时器列表的扫描以找到具有“属于”谁GetMessage()
。 队列实际上不存储任何关于哪个定时器被触发。 它们只关联存储的信息是QS_TIMER
标志和触发的定时器数量(以便GetMessage()
知道何时清除QS_TIMER
队列状态,一旦它合成了最后触发的定时器的消息)。
其他合成的消息类似地工作,它们基于存储在实际的队列消息列表之外的数据,但仍然在队列结构本身中的其他数据中。