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