Wysłanie komunikatu do wszystkich okien

0

Witam, jak wysłać komunikat(PostMessage) do wszystkich okien?
Myslałem, że wystarczy wysłać do aplikacji:

PostMessage(Application.Handle, MY_MSG, 0, 0);

ale nie.

Muszę rozesłać komunikat do wszystkich otwartych okien - do całej aplikacji, gdyż jest kilka okien(i mogą być otwarte jednocześnie - aplikacja MDI), które obsługują dany komunikat.

Chcę oczywiście obejść się bez iterowania okien MDI

0

Według http://msdn.microsoft.com/en-us/library/ms644944(VS.85).aspx :

hWnd
[in]
HWND_BROADCAST
The message is posted to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows. The message is not posted to child windows...

Wystarczy? A iterowanie po oknach z tego co pamiętam wcale nie jest takie straszne :)

0

@cyriel: No z opisu wynika że BROADCAST NIE wysyła do child windows.

@Juhas: A jak sprawdziłeś że to do aplikacji nie działa ? A jakbyś wrzucił na to okienko MDI TApplicationEvents i tam jest takie event OnMessage, spróbuj tak wyłapać, albo napisać metodę obsługi komunikatu. A co do iteracji, to jak napisał cyriel ... For i := 0 to MDIChildCount - 1 ... MDIChildern[i].CośtamCośtam. Fajnie przy tym mieć wszystkie okna dziedziczące po czymś więcej niż TForm, albo chociaż coś ciekawego implementujące.

b

0
b0bik napisał(a)

@Juhas: A jak sprawdziłeś że to do aplikacji nie działa ?

W bardzo prosty sposób. Wysłałem komunikat po naciśnięciu przycisku, a w oknie mam procedurę, która powinna wyłapać ten komunikat:

   procedure MojKomunikat(var Msg: TMessage); message MOJ_KOMUNIKAT;

No i nie odpaliła się.

A jakbyś wrzucił na to okienko MDI TApplicationEvents i tam jest takie event OnMessage, spróbuj tak wyłapać,

No spróbuję.

A co do iteracji, to jak napisał cyriel ... For i := 0 to MDIChildCount - 1 ... MDIChildern[i].CośtamCośtam.

Tak, no wiem, ale po prostu uważam, że to jest robienie niepotrzebnych rzeczy. Ale owszem, jeśli nie da się inaczej...
Możliwe też, że będę chciał odczytać komunikat w jakimś oknie modalnym, a tu już pojawia się problem.

Fajnie przy tym mieć wszystkie okna dziedziczące po czymś więcej niż TForm, albo chociaż coś ciekawego implementujące.

No mam, mam ;)

[dopisane]
OK, z użyciem TApplicationEvents działa. Ale pytanie nadal już bardziej teoretyczne, czemu nie działa "normalne" przechwycenie? Tj. z użyciem dyrektywy MESSAGE?

0

Może to trzeba dać w MainForm'ie (tę procedurę obsługi komunikatu), ale w sumie zgaduje. Pewnie nie bez kozery komponent nazywa się TAPPLICATIONEvents. Message idzie do aplikacji - a wiec moze konkretnie do jej głównego okna.

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