不同种类的操作系统中断处理程序的管道后,必须将消息在说:“消息队列',但是这个队列驻留在进程地址空间中的什么地方?它如何暴露给中断处理程序代码?
窗口与线程关联。带窗口的每个线程在进程的地址空间中都有一个线程队列。操作系统在其自己的地址空间中有一个内部队列用于硬件生成的事件。使用事件的细节和其他状态信息(例如,哪个窗口具有焦点),操作系统将硬件事件转换为消息,然后将其置于适当的线程队列中。
发布的消息直接放置在目标窗口的线程队列中。
发送的消息通常直接处理(绕过队列)。
细节变得毛茸茸的。例如,线程队列不仅仅是消息列表 - 它们还保留一些状态信息。某些消息(如WM_PAINT)并未真正排队,但是在查询队列时它是从附加状态信息合成的,并且它是空的。发送到其他线程所拥有的窗口的消息实际上被发送到接收者的队列中,而不是直接处理,但是系统使它看起来像来自呼叫者的观点的常规阻塞发送。如果这可能导致死锁(因为循环发送回原始线程),则会产生欢闹。
杰弗里里希特书有很多(所有?)的血淋淋的细节。我的版本是旧的(高级Windows)。目前的版本似乎被称为Windows via C/C++。
操作系统做的工作很多,以便使邮件流出现理性(比较简单)给调用者。
这意味着'翻译'的消息?对TranslateMessage()的调用真的有用吗?
它监视虚拟按键消息,并且当它识别按键/按键组合时,它添加字符消息。如果您不拨打TranslateMessage,则不会收到像WM_CHAR这样的字符消息。
我怀疑它在返回之前直接发送字符消息(而不是发布它们)。我从来没有检查过,但我似乎记得WM_CHAR消息就在WM_KEYUP之前到达。
一旦DispatchMessage()派发,在到达我的WndProc(即操作系统用它做什么)之前,消息摆动的所有地方是什么?
DispatchMessage将消息传递给目标窗口的WndProc。一路上,它的一些钩子可能有机会看到该消息(并可能干扰它)。
这是错的。只有当问题是关于Win16的时候,那些正确的部分才是正确的,在Win16中,整个操作系统和应用程序在单个线程上被共同操作。 – 2009-08-20 07:55:02