#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) Хук устанавливается при первом подписчике, снимается, когда подписчиков не осталось.