WM_USER 与 WM_APP

问题描述 投票:0回答:3

我希望工作线程向UI线程消息队列发送用户定义的消息,但我不确定是否应该使用

WM_USER
WM_APP
WM_APP
的文档说:

WM_APP 至 0xBFFF

消息可供应用程序使用。

那么我应该使用

WM_APP
吗?

c winapi
3个回答
11
投票

微软对其 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

范围内尚未被应用程序使用的消息,并且确保记录下来以便以后维护。

    


3
投票
IsDialogMessage

),那么您可以使用

WM_USER+xxx
(与
x >= 0
)。

否则,只要您控制包含该窗口的应用程序,您至少应该使用

WM_APP+xxx


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

RegisterWindowMessage()

    


0
投票

新旧事物,2003 年 12 月 2 日: 有效的窗口消息分为四类。

© www.soinside.com 2019 - 2024. All rights reserved.