WM_USER与WM_APP

时间:2015-06-15 11:00:45

标签: c winapi

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

  

WM_APP到0xBFFF

     

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

我应该使用WM_APP吗?

2 个答案:

答案 0 :(得分:4)

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

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

MSDN says

  

第二个范围(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

相关问题