Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как в WndProc обработать сообщения от конролов с формы? [D5, Win2k]


BillyJeans ©   (2004-03-12 12:18:00) 

Как в WndProc обработать сообщения от конролов, расположенных на форме? Задача стоит в том, чтобы поймать сообщение WM_MOUSEMOVE, от кнопки...


Diamond Cat   (2004-03-12 16:33:00) [1]


> Игорь Шевченко ©   (12.03.04 16:30) [6]
> Diamond Cat ©   (12.03.04 16:14)
>
> Дело не в крутизне
про крутизну было просто так ляпнуто (для связки слов) просто я удивился, обычно твои ответы звучат довольно точно (кроме тех случаев когда ты не посылаешь всех читать книги), а тут такой растрел мухи из крупнокалиберного оружия. :о)


Игорь Шевченко   (2004-03-12 16:30:00) [2]

Diamond Cat ©   (12.03.04 16:14)

Дело не в крутизне. Что под руку попалось, то и дал.

Описанный перехватчик ловит все сообщения, как поставленные в очередь, так посланные по SendMessage и вызванные методом Perform.


Diamond Cat   (2004-03-12 16:14:00) [3]

Игорь, это конечно круто но все же не проще ли таки переопределение appliction.onmessage и классов не надо новых городить. И если уж на то пошло, то еще можно посоветовать переопределить wndproc компонента с помощью setwindowlong. Не понятно твое стремление усложнить задачу.  :о)


Игорь Шевченко   (2004-03-12 15:26:00) [4]

type
 THSControlMessagePumpHook = class
 private
   FControl : TControl;
   FOldWndProc : TWndMethod;
   procedure HookWndProc (var Message : TMessage);
 public
   constructor Create (AControl : TControl);
 end;

constructor THSControlMessagePumpHook.Create(AControl: TControl);
begin
 FControl := AControl;
 FOldWndProc := FControl.WindowProc;
 FControl.WindowProc := HookWndProc;
end;

procedure THSControlMessagePumpHook.HookWndProc(var Message: TMessage);
begin
 if Assigned(FControl) and (FControl is TWinControl) and
    TWinControl(FControl).HandleAllocated then
  ... проверка сообщения и делание своих дел ...
 FOldWndProc(Message); // Вызов оригинальной процедуры Control'а
end;


В методе .loaded формы (вроде, подходящее место)
можно сказать
MyHook := THSControlMessagePumpHook.Create(Button1);

После этого все сообщения, приходящие контролу будут проходить через HookProc класса


NAlexey   (2004-03-12 15:18:00) [5]

Обрабатывай Application.OnMessage, если тебя интересует конкретно WM_MOUSEMOVE. Потому как некоторые WM_ туда не попадают.


Asdor   (2004-03-12 15:15:00) [6]

2 NAlexey
Я думаю, трудности в том, что сообщение WM_MOUSEMOVE посылается контролу, а не форме, на которой он лежит... И обрабатываются они в WndProc контрола...
Видимо поймать сообщение на форме просто так не получится.


NAlexey   (2004-03-12 14:52:00) [7]

Обыкновенно.
case Message of
 WM_MOUSEMOVE:
 begin
 
 end;
end;

А в чем трудности то?


Наверх

Титульная страница Поиск, карта сайта Написать письмо