【问题标题】:How to define private base Application messages?如何定义私有基础应用程序消息?
【发布时间】:2014-01-02 23:10:48
【问题描述】:

我一年来一直在我的应用程序中使用私人消息:

UM_APP_BASE = WM_APP; // WM_APP is declared as WM_APP = $8000; in "Controls" unit.

然后定义了我的私信:

UM_EXPLORER_MSG = UM_APP_BASE + 1;
UM_LICENSE_CHANGE_MSG = UM_APP_BASE + 2;
etc...

在我的课堂上像这样使用它们:

procedure UMLicenseChanged(var Message: TMessage); message UM_LICENSE_CHANGE_MSG;

(我也使用RegisterWindowMessage 与我的其他应用程序“交谈”,但那是另一回事)

我不记得最初是什么让我决定使用 WM_APP 而不是 WM_USER 作为基础。
文档说:

WM_USER 常量用于区分消息值 保留供 Windows 使用的值和可由 应用程序在私有窗口类中发送消息。有 五个范围的消息编号:

Range   Meaning
0 through WM_USER - 1   Messages reserved for use by Windows.
WM_USER through 0x7FFF  Integer messages for use by private window classes.
0x8000 through 0xBFFF   Messages reserved for future use by Windows.
0xC000 through 0xFFFF   String messages for use by applications.
Greater than 0xFFFF Reserved by Windows for future use.

这意味着WM_APP“保留供Windows 将来使用”。 另一方面,德尔福使用CM_BASE = $B000;,它在那个范围内。还有CN_BASE = $BC00;

如何定义基本消息,使其不会与 Windows/Delphi/Other 控件使用的其他消息发生冲突? 我的应用程序首选哪个基本消息作为私有消息?为什么?
我应该使用WM_USER 而不是WM_APP 吗?请注意,WM_USER base 也被 Windows 用于 CommCtrl,例如TB_ENABLEBUTTON = WM_USER + 1。等等……

我需要一些关于这个问题的见解。


我在我的 Delphi 帮助 API (D5) 上阅读了此内容。这显然已经过时了!
这可能就是我决定使用WM_APP的原因。
不过,解释一下两者之间的区别会很好:)

【问题讨论】:

  • 您可能已经阅读过 WM_APPWM_USER 的文档,他们说 " WM_APP (0x8000) 到 0xBFFF - 可供应用程序使用的消息。"
  • 对于您自己的窗口类来说,WM_USER 基础是完全安全的(除非该类是某个常见 Windows 控件的后代)。当然,该基地的消息发送者永远不应该广播它们。
  • @kobik WM_USER 范围内的消息对于不同的窗口类具有不同的含义。因此,广播它们总是错误的。
  • @kobik,我想我明白了你的问题的重点。您希望从WM_APP 基础开始为您自己的目的拥有一个真实的消息范围,而不会与CM_CN_ 消息发生任何冲突。好吧,那么我会说WM_APP..CM_BASE - 1 应该是你要找的。​​span>
  • @kobik 例如,TSpeedButton 向其父级广播。 直接向您的父级发送消息与“广播”不同。所以重点是允许 WM_USER 范围内的消息重叠,因为它们不应该不分青红皂白地向所有人广播。但是 WM_USER 消息可以专门发送/发布到应该能够处理它们的目标目标。 (即使这些消息 ID 与为其他控件设计的其他消息 ID 重叠。)

标签: delphi winapi messages


【解决方案1】:

我不确定您的信息来自哪里。 MSDN documentation 说:

0 到 WM_USER –1
保留供系统使用的消息。

WM_USER 到 0x7FFF
供私有窗口类使用的整数消息。

WM_APP (0x8000) 到 0xBFFF
可供应用程序使用的消息。

0xC000 到 0xFFFF
供应用程序使用的字符串消息。

大于 0xFFFF
由系统保留。


现在,WM_USER 范围和 WM_APP 范围之间有什么区别?这在很多地方都有介绍。例如,here is what Raymond Chen has to say

0x400 .. 0x7FFF (WM_USER .. WM_APP-1):类定义的消息。

这些消息的含义由 窗口类。 (非正式地:由调用 RegisterClass 的人 那个窗口类。)例如,WM_USER+1 消息意味着 TB_ENABLEBUTTON 如果窗口是工具栏控件,但它意味着 TTM_ACTIVATE 如果它是一个工具提示控件,它意味着 DM_SETDEFID 如果 它是一个对话框。如果您创建了自己的控件,则意味着 完全不同的东西。因为任何人都可以创建一个 在这个范围内的消息,操作系统不知道是什么 参数意味着并且不能执行自动编组。

0x8000 .. 0xBFFF (WM_APP ... MAXINTATOM-1):应用程序定义的消息。

这些消息的含义由应用程序决定 创建了窗口。 (非正式地:由打电话的人 CreateWindow.) 此消息区域是在 Windows 95 中创建的,以确保 子类化窗口并生成自定义消息的应用程序 不会干扰窗口类创建的新消息 未来的版本。同样,因为任何人都可以在此创建消息 范围,操作系统不知道参数的含义和 无法执行自动编组。

从这一切中得到的主要信息是,如果您在 WM_USER 范围内定义消息,那么请准备好让应用程序中的其他控件对这些相同的消息有自己的用途。例如,您不得在WM_USER 范围内广播消息。

另一方面,WM_APP 范围内的消息旨在对应用程序中的所有不同窗口类具有相同的含义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多