Вверх ↑
Ответов: 4630
Рейтинг: 749
#1: 2016-02-10 13:20:46 ЛС | профиль | цитата
Можно так:


#pas

var
CmpList: PList;

function Hook(Code, W, L: Integer): LResult; stdcall;
var
Str: string;
I: Integer;
begin
if CmpList <> nil then
begin
Str := Int2Str(LoWord(W))+'_'+Int2Str(HiWord(W));
for I := 0 to CmpList.Count - 1 do
_hi_OnEvent(THiAsmClass(CmpList.Items[I]).ev, Str);
end;

Result := CallNextHookEx(H, Code, W, L);
end;

procedure AddToList(Component: THiAsmClass);
begin
if CmpList = nil then
begin
CmpList := NewList;
SetWindowsHookEx(...); // Установили хук
end;
//if CmpList.IndexOf(Component) = -1 then // Защита от дублирования, если такое возможно
CmpList.Add(Component);
end;


procedure RemoveFromList(Component: THiAsmClass);
begin
if CmpList <> nil then
begin
CmpList.Remove(Component);
if CmpList.Count = 0 then
begin
UnhookWindowsHookEx(...); // Убрали хук, если нет слушающих компонентов
CmpList.Free;
CmpList := nil;
end;
end;
end;


1) Когда компонент хочет подписаться на сообщения - вызывает AddToList(Self)
2) Когда хочет отписаться - RemoveFromList(Self)
3) Хук устанавливается при первом подписчике, снимается, когда подписчиков не осталось.
карма: 26

1
Голосовали:3042