con una classe (TObject) ho:Messaggi personalizzati in classi non-Windowed - bisogno di un gestore predefinito?
private
FHwnd : HWND;
procedure HandleMyMessage(var Message : TMessage); message TH_MYMESSAGE;
dove TH_MYMESSAGE = WM_USER + 1
nel costruttore della classe:
FHwnd := AllocateHWND(HandleMyMessage);
L'unico oggetto che riceve un riferimento a FHwnd
è una consuetudine privata TThread (creato all'interno di questa classe) e l'unico messaggio che invia è TH_MYMESSAGE
. La mia comprensione è che la direttiva message
nella dichiarazione di procedura limita la sua gestione solo a TH_MYMESSAGE
.
Questo stava funzionando bene nei test, ma dopo l'integrazione in un'applicazione molto più grande sto ricevendo il feedback che HandleMyMessage
si attiva anche per altri messaggi (con evidenti risultati indesiderati).
Questo è stato facilmente corretto aggiungendo if Message.Msg <> TH_MYMESSAGE then Exit;
in HandleMyMessage
. La mia domanda è: perché sta succedendo questo?
La mia ipotesi migliore è che AllocateHWND
abbia reso HandleMyMessage
l'equivalente di un DefWndProc
nonostante abbia la direttiva message
. C'è un modo corretto per implementare questo che mi manca?
la tua ipotesi è corretta 'HandleMyMessage' diventa' WndProc' del creato non visivo finestra. quindi riceve tutti i messaggi; anche la tua soluzione per filtrare 'Message.Msg' è corretta. modificatore del metodo 'message' usato da Delphi per la gestione predefinita delle chiamate' TObject.Dispatch' (in classi non a finestra) – teran
@teran Supponendo, quindi, che volessi un 'WndProc' predefinito per gli altri messaggi il filtro' HandleMyMessage' correttamente con la direttiva 'message' se avessi fatto' AllocateHWND' su qualche altra procedura generale? –
@Ken Nessun problema con WM_USER qui. –