Создание пользовательских типов сообщений в Win32? - PullRequest
10 голосов
/ 29 ноября 2009

Есть ли способ определить и отправить пользовательские типы сообщений в Win32, которые будут перехвачены вашим основным обработчиком сообщений? Например, мой основной обработчик сообщений захватывает такие сообщения, как WM_PAINT, WM_RESIZE, WM_LBUTTONDOWN и т. Д. Могу ли я создать свой собственный WM_DOSOMETHING? Если да, то как мне отправить это сообщение?

Ах, я на самом деле только что обнаружил, что об этом спрашивали раньше здесь , однако, он не отвечает, как я на самом деле отправил бы это сообщение.

Ответы [ 3 ]

15 голосов
/ 30 ноября 2009

Ого, давайте просто остановимся и подумаем здесь ...

Прежде всего, сама Windows отправляет сообщения в диапазоне WM_USER+n, поэтому было изобретено WM_APP (я нашел это нелегко). Но становится еще хуже ... ничто не может остановить плохо ведущие себя приложения , транслирующие WM_USER+n или WM_APP+n сообщений, и поскольку люди украли кристалл бесконечной глупости у Богов, это действительно происходит в реальный мир.

Итак, повторяйте за мной, единственное безопасное сообщение - это то, что я определяю сам и могу видеть только себя. Используйте RegisterWindowMessage. И даже тогда будьте недоверчивы. Когда мне нужна строка для определения RegisterWindowMessage, я использую GUIDGEN для создания строки и помещаю читаемый человеком префикс, специфичный для приложения, в результирующее gobbledygook, чтобы помочь мне различать несколько сообщений в коде.

Делайте ставку на глупость своих собратьев - это всегда выигрышная ставка.

Если вам нужен авторитетный фон по всей этой теме, см. здесь . Нет, это не мой сайт, это Джо Ньюкомер.

14 голосов
/ 29 ноября 2009

Да. Просто объявите константу в диапазоне WM_USER, например

#define WM_RETICULATE_SPLINES (WM_USER + 0x0001)

Вы также можете зарегистрировать сообщение по имени, используя API RegisterWindowMessage.

Затем вы можете отправлять эти сообщения, используя SendMessage, PostMessage или любой из их вариантов.

1 голос
/ 30 ноября 2009
  • Если вы создали окно class , вы можете использовать диапазон WM_USER (или WM_APP)
  • Если это не ваш класс, вы можете использовать WM_APP
  • Если вы хотите передать сообщение в каждое окно верхнего уровня, зарегистрируйте ваше собственное глобальное сообщение с помощью RegisterWindowMessage
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...