Newsgroup: it.comp.lang.delphi
Titolo: Broadcastare un messaggio

Appena una mia applicazione finisce il suo compito voglio che broadcasti a
tutto il sistema un messaggio tipo WM_USER+200 (che ho chiamato WM_FINITO).
Ma non ci riesco, ho provato con
SendMessageW(HWND_BROADCAST,WM_FINITO,0,0);
ma non funziona... una mia altra applicazione che monitora i messaggi che
riceve, non lo vede.
Anche con Perform(WM_FINITO,0,0);
ma questo la invia solo all'applicazione che performa quindi non serve a
niente penso.
Come posso fare? Vi ringrazio!!!!

 riceve, non lo vede.
Probabilmente stai montiorando i messaggi inviati alla message queue delle
applicazioni varie. SendMessage() non accoda messaggi ma invoca direttamente
la Window Procedure per farli elaborare.
Se lo invierai con PostMessage() probabilmente riuscirai a vederlo.
Saluti
--
- Carlo -

 massimo, con SendMessageTimeOut().
Mi sono dimenticata di annoverarlo tra i metodi che avevo provato...
Posto un pezzo di codice per essere piu' chiara.
In una aplicazione premo un pulsante e questa cerca di broadcastare il
messaggio WM_USER+200 al sistema (quello che vorrei fare ma non riesco)
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SendMessage(HWND_BROADCAST,WM_USER+200,0,0);
PostMessage(HWND_BROADCAST,WM_USER+200,0,0);
// Piu' altri che non elenco...
...
Nell'altra applicazione monitorizzo con il classico
void __fastcall TForm1::FormCreate(TObject *Sender)
{ Application->OnMessage = AppMessage; }
//--------------------------------------------------------------------------
-
void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{ if (Msg.message == (WM_USER+200)) Caption="Ricevuto!"; }
//--------------------------------------------------------------------------
-
Ma purtroppo non arriva niente.
E sto provando un po' di tutto... Ho provato anche con il message mapping ma
non arriva proprio niente.
Grazie ancora...

 non arriva proprio niente.
Dando un' occhiata al tuo codice sembra tutto corretto ... prova a
registrare un messaggio anche se non dovrebbe cambiare nulla.
--
- Carlo -

 SendMessageW(HWND_BROADCAST,WM_FINITO,0,0);
I messaggi WM_USER hanno senso solo all'interno dell'applicazione.
Per messaggi significativi per piu' applicazioni e' necessario
registrare il nuovo messaggio in tutte le applicazioni che lo dovranno
utilizzare:
WM_FINITO := RegisterWindowMessage(PChar('Ho finito di fare quel che
dovevo'));
Poi, come suggerisce Carlo Bertuccini, potrebbe essere meglio usare
PostMessage.
Saluti
Paolo Arosio
-- 
"La dimostrazione dell'esistenza di specie intelligenti nell'universo
 e' che non ci vengono a trovare" [Calvin & Hobbes]

 registrare un messaggio anche se non dovrebbe cambiare nulla.
Carlo grazie mille, regitrando un messaggio ho risolto. Probabilmente gli
interi nel range che stavo utilizzando non andavano bene per la
registrazione di messaggi di sistema, se ho interpretato bene quello che ho
trovato nell'help:
For sending private messages within a window class, an application can use
any integer in the range WM_USER through 0x7FFF. (Messages in this range are
private to a window class, not to an application. For example, predefined
control classes such as BUTTON, EDIT, LISTBOX, and COMBOBOX may use values
in this range.)
Anzi, leggendo or ora il messaggio di Paolo Arosio ho la conferma che č
proprio cosě!
Grazie ancora a tutti e due!!!!!!!!
Ely