关于Windows消息的分类

在Windows开发中,我们经常会使用的自定义消息,关于这个消息的数值选取,还是有点讲究的,今天就来具体看看(免得又掉沟里了)。

Windows消息,可以分为如下几类:

0~0x3FF (WM_USER – 1): 系统消息

这类消息是被操作系统定义并使用的消息。我们尽量不要在这个范围内定义我们自己的消息,因为它们会被操作系统使用并识别消息的WPARAM和LPARAM参数,并将它们在多个进程之间列集(Marshal)。

0x400~0x7FFF (WM_USER~WM_APP – 1): Windows类消息

在这个范围内定义的消息主要被用在Windows类中。举个例子,WM_USER 1这个消息,如果窗口是一个工具栏(toolbar)控件,则它表示TB_ENABLEBUTTON,如果窗口是一个工具提示(tooltip)控件,则它表示TTM_ACTIVATE,如果窗口是一个对话框,则这个消息表示DM_SETDEFID。如果你创建了你自己的自定义控件,那可能会表达的另一个完全不同的意思。因为开发者可能都会用到这个范围里的消息,所以操作系统不能清楚地知道应该如何解析这个消息,所以不会进行自动化列集。

0x8000~0xBFFF (WM_APP~MAXINTATOM – 1): 应用程序定义消息

这个范围内的消息是应用程序自己定义的。这个消息范围在Windows 95时期被创建,主要用来确保应用程序使用的自定义消息不会影响到将来Windows版本中的Windows类消息。和上面的Windows类消息一样,开发者可能都会用到这个范围里的消息,所以操作系统不能清楚地知道应该如何解析这个消息,所以不会进行自动化列集。

0xC000~0xFFFF (MAXINTATOM~MAXWORD): 注册消息

这个范围主要是通过RegisterWindowMessage注册的消息。需要注意的是,注册消息的实际数值可能会随着每次系统运行而不同,所以需要使用RegisterWindowMessage来获取实际的消息值。和上面的Windows类消息一样,开发者可能都会用到这个范围里的消息,所以操作系统不能清楚地知道应该如何解析这个消息,所以不会进行自动化列集。

windows消息机制第二次失败(关于Windows消息的分类和使用场景)(1)

,