WM_USER与WM_APP

我希望工作线程将用户定义的消息发送到UI线程消息队列,但我不确定是否应该使用WM_USERWM_APPWM_APP的文档说:

WM_APP到0xBFFF

可供应用程序使用的消息。

我应该使用WM_APP吗?

Microsoft对其API非常保守,因此当您看到WM_APP到0xBFFF的消息与系统消息不冲突时,您可以放心。 它需要在Windows API中进行重大更改才能破坏该规则,并且许多其他应用程序无法生存。

唯一相关的问题是:您是否需要在WM_USER范围或WM_APP范围内使用消息?

MSDN说 :

第二个范围(WM_USER到0x7FFF)中的消息号可以由应用程序定义和使用,以在私有窗口类中发送消息。 这些值不能用于定义整个应用程序中有意义的消息,因为某些预定义的窗口类已经定义了此范围内的值。 例如,预定义的控件类(如BUTTON,EDIT,LISTBOX和COMBOBOX)可以使用这些值。 除非应用程序旨在交换消息并将相同含义附加到消息编号,否则不应将此范围内的消息发送到其他应用程序。

第三个范围(0x8000到0xBFFF)中的消息号可供应用程序用作私人消息。 此范围内的消息不与系统消息冲突。

(强调我的)

如果您将这些消息显式发布到旨在以特定方式处理它们并且不是Windows控件的子类的窗口,则可以使用WM_USER范围。 如果它们要由消息循环直接处理(例如WM_QUIT ),或者如果有疑问,请使用WP_APP范围。

换句话说,由于您不需要大量此类消息,并且您希望将它们发布到UI线程消息队列,只需使用应用程序尚未使用的WM_APP范围中的WM_APP ,并确保将其记录为以后的维修。

如果你完全控制了目标窗口的窗口类(即你定义了它,你没有对另一个类进行子类化/超类化,并且你没有在窗口上使用IsDialogMessage )那么你可以使用WM_USER+xxxx >= 0 )。

否则,您应该至少使用WM_APP+xxx ,前提是您控制包含该窗口的应用程序。

如果做不到这一点,剩下的唯一选择就是RegisterWindowMessage()