Delphi 如何定义私有基应用程序消息?

Delphi 如何定义私有基应用程序消息?,delphi,winapi,messages,Delphi,Winapi,Messages,我在我的应用程序中使用私人消息的时间如下: 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 Mes

我在我的应用程序中使用私人消息的时间如下:

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\u应用程序而不是
WM\u用户
作为基础。
文件说:

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

这意味着
WM_APP
是“为Windows的未来使用而保留的”。 另一方面,德尔福使用
CM_BASE=$B000在该范围内。还有
CN_BASE=$BC00

如何定义基本消息,使其不会与Windows/Delphi/其他控件使用的其他消息冲突? 我的应用程序首选哪种基本消息作为私有消息?为什么呢?
我应该使用
WM\u用户
而不是
WM\u应用程序
?请注意,
WM\u USER
base也由Windows在CommCtrl中使用,例如
TB\u ENABLEBUTTON=WM\u USER+1
。等等

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


我在我的Delphi帮助API(D5)上读到了这篇文章。这显然已经过时了
这可能就是为什么我决定使用
WM\u应用程序


不过,解释一下两者之间的区别还是不错的:)

我不知道你的信息来自哪里。MSDN说:

0到WM_用户–1
保留供系统使用的消息

WM_用户通过0x7FFF
私有窗口类使用的整数消息

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

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

大于系统保留的0xFFFF


现在,
WM_用户
范围和
WM_应用程序
范围之间有什么区别?这在许多地方都有涉及。例如

0x400。。0x7FFF(WM\U USER..WM\U APP-1):类定义的消息。

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

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

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

从所有这些中可以看出,如果您在
WM\u USER
范围内定义消息,那么就要准备好让应用程序中的其他控件自己使用这些消息。例如,您不能在
WM_USER
范围内广播消息


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

您可能已经阅读了或的文档,其中他们说“WM_APP(0x8000)到0xbff-应用程序可使用的消息”对于您自己的窗口类来说,
WM_USER
base是完全安全的(除非该类是某个公共窗口控件的后代)。当然,这类消息的发送者永远不应该对它们进行广播。@WM_USER
范围内的kobik消息对于不同的窗口类有不同的含义。“所以播放这些节目总是一个错误。”科比克,我想我明白你问题的意思了。您希望从
WM\u应用程序
base开始,在不与
CM\u
CN\u
消息发生任何冲突的情况下,为自己的目的创建一个真正的消息范围。好吧,那么我会说,
WM_APP..CM_BASE-1
应该是您要找的。@kobik好吧,例如,TSpeedButton向它的家长广播。直接向父母发送信息与“广播”不同。因此,关键是WM_用户范围内的消息允许重叠,因为它们不应该不加区别地向所有人和其他人广播。但是WM_用户消息可以专门发送/发布到应该能够处理它们的预期目标。(即使这些消息ID与为其他控件设计的其他消息ID重叠。)
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.