Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > WM_ACTIVATE в своей проге


Автор: December 19.10.2006, 12:36
Greetings All.

Есть задача перехватить WM_ACTIVATE, посланный любой форме в проге. Прописывать специальный message handler в каждой форме (их 20+) не хочется. Application.OnMessage и ApplicationEvents.OnMessage эту мессагу не ловят. Есть ли способ как-нить централизованно перехватывать это сообщение?

Автор: Romikgy 19.10.2006, 12:55
имхо хук

Автор: Yanis 19.10.2006, 23:17
А если использовать компонент TApplicationEvents?

Автор: December 20.10.2006, 00:23
Цитата(December @  19.10.2006,  12:36 Найти цитируемый пост)
Application.OnMessage и ApplicationEvents.OnMessage эту мессагу не ловят.


Автор: Yanis 20.10.2006, 00:30
Просто я проверял... И у меня всё ловится.

Автор: digs 20.10.2006, 01:37
Да просто создать наследника от TForm, который это все сделает, а потом эти 20+ от него наследовать. Вроде быстро получится

Автор: December 20.10.2006, 02:21
Цитата(Yanis @  20.10.2006,  00:30 Найти цитируемый пост)
Просто я проверял... И у меня всё ловится. 

Серьёзно? А тестовый проект у тебя случаем не сохранился? Я тоже экспериментировал smile
digs, да, это один из вариантов решения, но есть ещё один дополнительный нюанс: в проге иногда появляются MessageBox'ы от чужих ActiveX объектов, и хочется ловить ИХ мессаги также.

Автор: Yanis 20.10.2006, 02:35
Может я неправильно понял.... Нужно ловить WM_ACTIVATE, если переключение идёт между not modal окнами одного проекта?

Автор: Fedia 20.10.2006, 04:51
Цитата(December @  19.10.2006,  12:36 Найти цитируемый пост)
Есть задача перехватить WM_ACTIVATE, посланный любой форме в проге.

Может для твоей задачи будет достаточно переопределить события OnActivate для всех форм проекта ?
Код

procedure TForm1.FormActivateAll(Sender: TObject);
begin
  ShowMessage(TForm(Sender).Name);
end;

//...
var
  i: Integer;
begin
  for i:=0 to Screen.FormCount - 1 do
  Screen.Forms[i].OnActivate:=FormActivateAll;
end;

Хотя если 
Цитата

The WM_ACTIVATE message is sent to both the window being activated and the window being deactivated
 то и для OnDeactivate проделать аналогичную операцию.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)