GetMessage → TranslateMessage → DispatchMessage。WndProc,處理該視窗訊息。WinMain、初始化、訊息迴圈 (Run())。WndProc 並處理例外。TObject,根據 TMessage.Msg 查找對應處理方法,沿繼承鏈向上尋找,最終呼叫 DefaultHandler。常用訊息 (如 WM_PAINT, WM_LBUTTONDOWN) 封裝為事件屬性 (OnPaint, OnClick),開發者只需編寫事件處理器並指派,無需處理訊息細節。
當需處理 VCL 未定義的訊息 (如 WM_COPYDATA, 自訂 WM_USER+xxx),必須覆寫 Dispatch。VCL 提供三個巨集簡化:
#define BEGIN_MESSAGE_MAP virtual void __fastcall Dispatch(void* Message) \
{ switch (((PMessage)Message)->Msg) {
#define VCL_MESSAGE_HANDLER(msg, type, method) \
case msg: method((type)Message); break;
#define END_MESSAGE_MAP(base) \
default: base::Dispatch(Message); break; } }
class TMyForm : public TForm {
public:
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_COPYDATA, PCOPYDATASTRUCT, OnCopyData)
END_MESSAGE_MAP(TForm)
void __fastcall OnCopyData(PCOPYDATASTRUCT pcds) {
// pcds->dwData, pcds->cbData, pcds->lpData
ShowMessage("收到跨程序資料");
}
};
巨集展開後產生新的 Dispatch,優先處理自訂訊息,其他轉交父類別,保證原有機制完整。

Dispatch。WM_USER (0x0400) 以上,避免衝突。PostMessage / SendMessageTimeout,避免死結。PeekMessage 非阻塞迴圈或 TTimer 定時處理。