PostMessage不会触发消息处理程序

时间:2014-01-06 08:25:56

标签: c++ winapi visual-c++

我有一个VC ++代码,它使用PostMessage来触发函数调用。虽然函数最终被调用,但我发现在执行PostMessage之后函数没有被调用。在包含PostMessage命令的函数完成执行后,甚至不会调用它。我注意到在调用所需函数之前调用了一些函数。

我想知道是什么决定了什么时候调用消息的回调。

该消息是WM_USER消息。

2 个答案:

答案 0 :(得分:1)

并非所有消息都相同。 PostMessage不会简单地将其添加到队列数据结构中;操作系统将进行大量操作和优先级排序。不同的消息会得到不同的优先级,而像WM_PAINT这样的消息根本无法像这样发送。

所以没有办法概括“什么时候会PostMessage调用消息处理程序?”这取决于您发送的消息,目标消息队列的繁忙程度以及目标消息循环的行为方式。

我认为没有任何关于消息优先级的简明列表。

答案 1 :(得分:1)

简介Windows事件驱动模型(简化了许多重要细节):

有一个“消息泵”,这是一个循环,在每次迭代时,从队列中拉出一条消息,并通过调用与特定窗口关联的“窗口过程”来“调度”它,并将详细信息传递给它来自消息。

如果您正在使用框架,则可能会为您提供消息泵和窗口过程,并且提供的窗口过程会调用您的处理函数以响应它收到的消息。

当消息发布时,它会被添加到队列中,在消息泵到达之前没有其他任何事情发生。队列中可能有前面的消息,和/或在执行返回消息泵之前可能会运行一堆其他代码。

当消息发送时,消息不会添加到队列中。相反,发送代码将直接调用窗口过程。 (警告:这是一个过于简单化的事情。当向另一个线程发送消息时情况会更复杂。)

因此,如果在您希望发布的消息之前调用其他函数,则可以使用以下函数:

  1. 发布消息时,其他消息已在队列中。

  2. 正在发送其他消息而不是发布消息,因此它们会立即处理,只有当它们完成并且消息泵最终再次运行时才会处理您发布的消息。

  3. 消息泵决定在您之后发布的其他消息更重要,因此应首先处理。 (这实际上并不常见。某些类型的消息,如WM_PAINT,是非常低的优先级,只有当队列中没有任何内容时才会生成,但我想不出一个消息优先于已经存在的消息的情况。队列中。)

  4. 在消息泵启动之前,您在初始化期间发布了消息。例如,如果您创建一个窗口,向其发布消息,然后启动消息泵,那么队列中可能会有一系列与您发布的消息之前的窗口创建相关的消息。