我希望工作线程向UI线程消息队列发送用户定义的消息,但我不确定是否应该使用
WM_USER
或WM_APP
。 WM_APP
的文档说:
WM_APP 至 0xBFFF
消息可供应用程序使用。
那么我应该使用
WM_APP
吗?
微软对其 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
范围内尚未被应用程序使用的消息,并且确保记录下来以便以后维护。
IsDialogMessage
),那么您可以使用
WM_USER+xxx
(与x >= 0
)。否则,只要您控制包含该窗口的应用程序,您至少应该使用
WM_APP+xxx
。
如果做不到这一点,剩下的唯一选择就是
RegisterWindowMessage()
。
新旧事物,2003 年 12 月 2 日: 有效的窗口消息分为四类。
WM_USER
-1):系统定义的消息。
和 LPARAM 参数,并可以编组进程之间的消息(或知道拒绝这样做)。
WM_USER
…
WM_APP
-1):类定义的消息。
这些消息的含义由窗口类的实现者决定。 (非正式地:由为该窗口类调用 RegisterClass 的人调用。)例如,WM_USER
+1 消息意味着:
TB_ENABLEBUTTON
如果窗口是工具栏控件
TTM_ACTIVATE
如果是工具提示控件
DM_SETDEFID
如果是对话框的话。
WM_APP
…
MAXINTATOM
-1):应用程序定义的消息。
这些消息的含义由创建窗口的应用程序决定。 (非正式地:由调用 MAXINTATOM
…
MAXWORD
):注册消息。
这些消息的含义由RegisterWindowMessage的调用者决定。请注意,注册消息的数值在不同的运行中可能会发生变化,因此您必须使用 RegisterWindowMessage 来获取消息编号。再次强调,由于任何人都可以在这个范围内创建消息,因此操作系统不知道这些参数的含义,也无法执行自动编组。