首页 > 解决方案 > 应用程序定义的消息 ID 是否应该是唯一的?

问题描述

我经常不得不在应用程序中使用基于 Windows 消息的事件模型来通知应用程序的主线程其他线程的一些结果。这种方法可以让您摆脱线程之间的阻塞。

文档说系统消息 ID 必须是唯一的。但是我没有找到应用程序消息的这种条件。同时,在 Internet 上,您经常可以找到这样一种观点,即在应用程序中,消息标识符必须是唯一的。

我认为在应用程序中保持独一无二没有任何意义。发送消息时,我们指定一个特定的窗口句柄来处理该消息。我可以在不同的窗口中使用相同的消息 ID,但决定消息接收者的是窗口句柄。它有效。

是否有任何明显的理由来跟踪应用程序中消息 ID 的唯一性?

标签: windowswinapi

解决方案


不要求所有消息 ID 在应用程序中都是唯一的。事实上,我们一直在使用多重分配的消息 ID:窗口类使用基于WM_USER的消息来实现特定于类的行为。最突出的示例是使用消息 ID 范围实现特定于控件的行为的通用控件。[WM_USER..WM_APP)

如果您正在打电话RegisterClassEx,您选择使用WM_USER-based 消息。您可以自由地重用不同窗口类使用的任何值,而不会冒冲突的风险。它是接收窗口的类和控制行为的消息 ID 的组合。

如果您没有接收器(例如,在调用 时PostThreadMessage),您需要确保您可以唯一标识一条消息(及其有效负载)。在这种情况下,最简单的方法是使用WM_APP范围内的唯一消息 ID 。


推荐阅读