Форум: "Основная";
Текущий архив: 2003.02.03;
Скачать: [xml.tar.bz2];
ВнизВопрос глупый, но что-то никак не могу сообразить: Найти похожие ветки
← →
Юрий Федоров (2003-01-23 19:50) [0]как в форме отлавливать сообщения, приходящие на handle"ы ее Сontrol"ов ?
← →
leonon (2003-01-23 20:02) [1]Если ты знаешь какое конкретно сообщение тебе надо отловить, то объявляешь, например
TForm ...
private
procedure WMClose(var a: TWMClose); message WM_CLOSE;
...
end;
Далее реализуешь этот обработчик.
Если надо отлавливать любые сообщения, то тебе надо делать подмену оконной процедуры.
← →
Юрий Федоров (2003-01-23 20:04) [2]>leonon
Меня интересует конкретное сообщение, но приходит оно не на форму, а на контрол в форме(например на Edit1.handle)
← →
leonon (2003-01-23 20:08) [3]По-моему, сообщение получает форма, а потом его передает всем своим контролам. Или я не прав?
← →
MBo (2003-01-23 20:10) [4]Application.OnMessage?
← →
Юрий Зотов (2003-01-23 22:04) [5]> leonon (23.01.03 20:08)
Не прав. Сообщение приходит тому окну, которому оно адресовано. В некоторых (но далеко не во всех) случаях оно действительно сначала "проходит через форму", но это скорее исключение, чем правило.
> Юрий Федоров
Application.OnMessage.
А в нем:
FindControl(Msg.HWnd) - контрол-адресат, а его Owner (приведенный к TForm)- нужная Вам форма.
← →
Романов Р.В. (2003-01-23 22:22) [6]А что за сообщение то? OnMessage не все ловит. Может оконную процедуру едита подменить?
← →
Guerrillero (2003-01-23 22:24) [7]можно заменить его оконную процедуру WindowProc на свою
← →
Игорь Шевченко (2003-01-24 10:22) [8]Если на конкретный контрол, то Guerrillero © (23.01.03 22:24)
Если на все, то примерно так:
procedure TfMain.Loaded;
var
I : Integer;
begin
inherited;
FHooks := THSControlMessagePumpHookList.Create;
FHooks.Add(THSControlMessagePumpHook.Create(Self));
for I:=0 to Pred(ComponentCount) do
if Components[I] IS TControl then
FHooks.Add(THSControlMessagePumpHook.Create(TControl(Components[I])));
end;
unit HSControlMessagePumpHook;
interface
uses
HSObjectList, Controls, Messages;
type
THSControlMessagePumpHook = class
private
FControl : TControl;
FOldWndProc : TWndMethod;
procedure HookWndProc (var Message : TMessage);
public
constructor Create (AControl : TControl);
end;
THSControlMessagePumpHookList = class(THSObjectList)
end;
const EnableMsgHook = FALSE;
implementation
uses
Windows, SysUtils, MessageLogger;
{ THSControlMessagePumpHook }
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
LogMessage(Format("%s.WndProc", [FControl.Name]),
TWinControl(FControl).Handle, Message.Msg,
Message.WParam, Message.LParam)
else
LogMessage(Format("%s.WndProc", [FControl.Name]),
0, Message.Msg,
Message.WParam, Message.LParam);
FOldWndProc(Message);
LogMsgReturn(Format("%s.WndProc", [FControl.Name]), Message);
end;
end.
← →
Юрий Федоров (2003-01-24 10:30) [9]>Романов Р.В. © (23.01.03 22:22)
>Guerrillero © (23.01.03 22:24)
Подменять придется все WindowProc(для всех контролов), при этом запоминать указатели на старые и вызывать их, что достаточно муторно
>MBo © (23.01.03 20:10)
>Юрий Зотов © (23.01.03 22:04)
>Игорь Шевченко © (24.01.03 10:22)
Попробую. О результатах доложу :)
← →
Юрий Федоров (2003-01-24 10:34) [10]Application.OnMessage подошло.
Спасибо
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.02.03;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c