Как определить личные сообщения приложения?

Я использую личные сообщения в своем приложении за год следующим образом:

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 используется в CommCtrl Windows, например. TB_ENABLEBUTTON = WM_USER + 1. и т.д.

Мне нужна информация по этой проблеме.


Я прочитал это в моем API-интерфейсе Delphi (D5). который, очевидно, устарел!
Вероятно, поэтому я решил использовать WM_APP.
Тем не менее, объяснение различий между ними было бы приятным:)

Ответы

Ответ 1

Я не знаю, откуда взялась ваша информация. Документация MSDN сообщает:

0 через WM_USER -1
Сообщения, зарезервированные для использования системой.

WM_USER через 0x7FFF
Целочисленные сообщения для использования в классах частных окон.

WM_APP (0x8000) через 0xBFFF
Сообщения, доступные для использования приложениями.

0xC000 через 0xFFFF
Строковые сообщения для использования приложениями.

Больше, чем 0xFFFF
Зарезервировано системой.


В чем разница между диапазоном WM_USER и диапазоном WM_APP? Это было охвачено во многих местах. Например, вот что говорит Раймонд Чен.

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 должны иметь одинаковое значение для всех классов окон в приложении.