Windows 应用程序定义的消息ID应该是唯一的吗?

Windows 应用程序定义的消息ID应该是唯一的吗?,windows,winapi,Windows,Winapi,我经常不得不在基于Windows消息的应用程序中使用事件模型来通知应用程序的主线程其他线程的一些结果。这种方法允许您消除线程之间的阻塞 说明系统消息ID必须是唯一的。但我没有发现应用程序消息存在这样的条件。同时,在Internet上,您经常会发现,在应用程序中,消息标识符必须是唯一的 我认为在应用程序中保持唯一性没有任何意义。发送消息时,我们指定一个特定的窗口句柄来处理消息。我可以在不同的窗口中使用相同的邮件ID,但确定邮件收件人的是窗口句柄。它是有效的 是否有明显的理由跟踪应用程序中消息ID的

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

说明系统消息ID必须是唯一的。但我没有发现应用程序消息存在这样的条件。同时,在Internet上,您经常会发现,在应用程序中,消息标识符必须是唯一的

我认为在应用程序中保持唯一性没有任何意义。发送消息时,我们指定一个特定的窗口句柄来处理消息。我可以在不同的窗口中使用相同的邮件ID,但确定邮件收件人的是窗口句柄。它是有效的


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

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

如果您正在调用
RegisterClassEx
,您可以选择使用基于
WM_USER
的消息。您可以自由地重用其他窗口类使用的任何值,而不会有冲突的风险。接收窗口的类和消息ID的组合控制行为


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

组合消息+wparam+lparam是您的,您可以使用它执行任何操作。
PostThreadMessage
使用
idThread
参数向接收线程发送消息。它会将消息发布到指定线程的消息队列。thread mess每个线程的年龄ID必须是唯一的。