obsługa komunikatów

0

Mam pytanie trochę teoretyczne. Mam typowego hooka na główne okno

Application.HookMainWindow(AppHook);

gdzie sobie sprawdzam

function TMain.AppHook(var Mes: TMessage): Boolean;
begin     
result:=false;
if (Mes.Msg = mes1) then...else
if (Mes.Msg = mes2) then...else
(itd)

można oczywiście rownież tak obsłużyć komunikat, co również robię:

procedure Advance(var Mes: TMessage); message ADVANCE;

Teraz pytanie jaka jest różnica i czy są jakieś zalecenia odnośnie stosowania obydwu metod ?
Jeżeli dobrze rozumiem, to metoda pierwsza wyłapuje wszystkie komunikaty, natomiast druga obsługuje tylko jeden. Kiedy jednak chcąc mieć scentralizowaną obsługę komunikatów (tu ponawiam pytanie o zalecenia) przeniosłem dajmy na to procedure Advance z powyższego przykładu do AppHook, gdzie sam wysyłam komunikat w innym module pod Main.Handle :

SendMessage(Main.Handle,ADVANCE,

komunikat ADVANCE nie zostaje obsłużony.
Inne komunikaty otrzymywane z systemu lub wysyłane przeze mnie całkiem spoza aplikacji

SendMessage(WindowFromProcessID(PI.dwProcessId),WM_COPYDATA,

są wyłapywane.
Więc pytania:
1)czy dobrze rozumiem różnice czy jest ich więcej ?
2)zalecenia czy jak kto lubi ?
3)dlaczego mój komunikat nie jest wyłapywane w hooku ?

//edit: literówka

0

Application.HookMainWindow(AppHook); tu dostajesz wszystkie komunikaty jakie lecą do aplikacji nie okna i dopiero w metodzie wybierasz które chcesz obsłużyć

procedure Advance(var Mes: TMessage); message ADVANCE; - tu od razu mówisz które komunikaty chcesz obsłużyć i działa tylko na konkretnym oknie

z tego co pamiętam to kolejka komunikatów lecących do aplikacji jako takiej i lecących do jej głównego okna to są różne kolejki

zamiast
SendMessage(Main.Handle,ADVANCE,
daj
SendMessage(Application.Handle,ADVANCE,

0

no i wszystko jasne. po wielokroć odwdzięczam się :)

0

Taki mechanizm

procedure Advance(var Mes: TMessage); message ADVANCE;

wykorzystuje się przy dziedziczeniu / tworzeniu klasy aby obsłużyć konkretne komunikaty. Można też napisać własną implementację WndProc i przechwycić wszystkie komunikaty zanim trafią do handlerów. Czyli te mechanizmy są do tworzenia implementacji.

Natomiast jeśli chcesz hookować z zewnątrz tj. nie wewnątrz implementacji danej klasy to możesz przechwycić wszystkie komunikaty danej kontrolki korzystając z własności WindowProc lub komunikaty całej aplikacji - HookMainWindow. Czyli te mechanizmy są do podmiany implementacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1