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

时间:2013-12-15 15:15:55

标签: 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 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将来使用”。 另一方面,Delphi使用该范围内的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的原因 不过,关于两者之间差异的解释会很好:)

1 个答案:

答案 0 :(得分:17)

我不确定您的信息来自哪里。 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 if   这是一个对话框。如果您创建了自己的控件,那就意味着   别的东西完全不同。因为任何人都可以创建一个   消息在这个范围内,操作系统不知道是什么   参数意味着并且不能执行自动编组。

     

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

     

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

所有这一切的主要内容是,如果您在WM_USER范围内定义消息,那么请为应用程序中的其他控件做好准备,以便自己使用这些消息。例如,您不得在WM_USER范围内广播消息。

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