2014-06-06 11 views
5

Ho due applicazioni che ho bisogno di comunicare via PostMessage (SendMessage è escluso, come ho bisogno di avere la seconda applicazione in grado di output a Excel, pur essendo chiamato.Delphi: Come ricevere un messaggio di Windows personalizzato da PostMessage?

Finora Applicazione 1 effettua una chiamata a Applicazione 2, assicurandosi che sia aperta, e quando lo è, App 1 è impostato su disabilitato.

quando l'utente ha terminato con Applicazione 2 ho bisogno di inviare un messaggio torna al applciation 1 a a Lascialo per sbloccare.

ho registrato lo stesso messaggio di Windows in ogni applicazione utilizzando:

const 
    MyMessage = 'My-Message'; 

var 
    MyMessageID: cardinal; 

procedure TMF.FormCreate(Sender: TObject); 
begin 
    MyMessageID := RegisterWindowMessage(MyMessage); 
end; 

e in applicazione 2 posso pubblicare il messaggio a Application 1 utilizzando:

targetHandle := FindWindow(Pchar('TMF'), Pchar('Send Test')); 
... 
if PostMessage(targetHandle, (MyMessageID), 0, 0) then 
... 

Quello che non capisco è come dichiaro il gestore per il messaggio nell'applicazione 1.

Se si stesse utilizzando un messaggio standard di Windows, ad esempio WM_COPYDATA, avrei dichiarato una procedura

procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA; 

Ma quello cade perché non posso dichiarare MyMessageID abbastanza presto.

Forse è perché è venerdì pomeriggio, ma cosa mi manca?

risposta

6

Non è possibile utilizzare la parola chiave message perché la costante di messaggio non è nota al momento della compilazione. Invece devi scavalcare WndProc:

procedure WndProc(var Message: TMessage); override; 
.... 
procedure TMF.WndProc(var Message: TMessage); 
begin 
    inherited; 
    if Message.Msg = MyMessageID then begin 
    .... 
    end; 
end;