我希望工作线程将用户定义的消息发送到UI线程消息队列,但我不确定是否应该使用WM_USER
或WM_APP
。 WM_APP
的文档说:
WM_APP到0xBFFF
可供应用程序使用的消息。
我应该使用WM_APP
吗?
答案 0 :(得分:4)
Microsoft对其API非常保守,因此当您看到消息WM_APP
到0xBFFF 与系统消息不冲突时,您就会充满信心。它需要在Windows API中进行重大更改才能破坏该规则,许多其他应用程序将无法生存。
唯一相关的问题是:您是否需要使用WM_USER
范围或WM_APP
范围内的邮件?
第二个范围(WM_USER到0x7FFF)中的消息号可以由应用程序定义和使用,以在私有窗口类中发送消息。这些值不能用于定义整个应用程序中有意义的消息,因为某些预定义的窗口类已经定义了此范围内的值。例如,预定义的控件类(如BUTTON,EDIT,LISTBOX和COMBOBOX)可以使用这些值。此范围内的消息不应发送到其他应用程序,除非应用程序旨在交换消息并将相同的含义附加到消息编号。
第三个范围(0x8000到0xBFFF)中的消息号可供应用程序用作私人消息。此范围内的消息不会与系统消息冲突。
(强调我的)
如果您明确地将这些消息发布到旨在以特定方式处理它们并且不是Windows控件的子类的窗口,则可以使用WM_USER
范围。如果要通过消息循环直接处理它们(例如WM_QUIT
),或者如果有疑问,请使用WP_APP
范围。
换句话说,因为您不需要大量此类消息,并且您希望将它们发布到UI线程消息队列,只需使用应用程序尚未使用的WM_APP
范围内的消息,并确保将其记录下来以备日后维护。
答案 1 :(得分:1)
如果你完全控制了目标窗口的窗口类(即你定义了它,你没有继承/超类化另一个类,并且你没有在窗口上使用IsDialogMessage
)那么你可以使用{ {1}}(使用WM_USER+xxx
)。
否则,如果您控制包含该窗口的应用程序,则至少应使用x >= 0
。
如果做不到这一点,剩下的唯一选择就是WM_APP+xxx
。