WM_USER与WM_APP

Tom*_*Tom 9 c winapi

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

WM_APP到0xBFFF

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

我应该使用WM_APP吗?

Ser*_*sta 5

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应用程序尚未使用的范围内使用一个,并确保对其进行记录以备后用保养。

  • @IInspectable:OP表示该消息将被发布到* UI线程消息队列*。好的,我刚刚看到OP在其注释中表示它将由其主窗口处理,因此WM_USER应该是安全的……只要其主窗口未从对话框窗口中继承即可。这就是为什么我的建议是*如有疑问*使用WM_APP范围的原因 (3认同)

Med*_*noc 3

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

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

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