首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 訊息處理機制深度解析:從 Windows 訊息迴圈到 VCL Dispatch

     編輯:Delphi

1. Windows 訊息驅動架構

Windows 以訊息為核心:使用者輸入、系統事件、應用程式間通訊皆封裝為訊息 (MSG 結構) 投遞至執行緒訊息佇列。應用程式主迴圈 (GetMessage/TranslateMessage/DispatchMessage) 依序取出並分派給對應視窗程序 (WndProc)。

2. VCL 封裝層次

  • TApplication 內建訊息迴圈,提供 OnMessage 事件攔截所有訊息。
  • TControl 引入 WindowProc 屬性指向虛擬方法 WndProc。
  • 所有元件最終繼承 TObject,內建 Dispatch 方法依 message 指令動態查找對應處理方法。

3. 訊息記錄結構


type
  TMessage = packed record
    Msg: Cardinal;
    case Integer of
      0: (WParam: Longint; LParam: Longint; Result: Longint);
      1: (WParamLo, WParamHi, LParamLo, LParamHi, ResultLo, ResultHi: Word);
  end;

4. 自訂訊息與處理方法


const MY_MSG = WM_USER + 100;
type
  TMyMsg = record Msg: Cardinal; Param: Integer; Result: Longint; end;

  TMyControl = class(TCustomControl)
  protected
    procedure HandleMyMsg(var Msg: TMyMsg); message MY_MSG;
  end;

procedure TMyControl.HandleMyMsg(var Msg: TMyMsg);
begin
  // 處理邏輯
  inherited;  // 呼叫祖先同訊息處理 (若有)
end;

5. 重載標準視窗訊息


type TMyComp = class(TGraphicControl)
protected
  procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
end;

6. 關鍵方法與屬性

成員用途
DefaultHandler(var Msg)提供預設處理,可重載攔截所有未處理訊息
Dispatch(var Msg)核心分派器,依 message 指令查找方法
WindowProc 屬性可動態替換視窗程序 (子類別化)
Perform(Msg, WParam, LParam)直接送訊息給自身控件 (同步)
Broadcast(var Msg)廣播訊息給所有子控件

7. Windows API 對應

  • GetMessage / PeekMessage:取訊息。
  • TranslateMessage:虛擬鍵轉字元訊息。
  • DispatchMessage:分派至 WndProc。
  • PostMessage / SendMessage:非同步/同步發送訊息。

實務建議

  1. 優先使用 VCL 事件 (OnClick 等),僅在需攔截無對應事件的訊息時才重寫 WndProc 或掛 message 方法。
  2. 自訂訊息用 WM_USER + n 避免衝突。
  3. 處理訊息後若不想傳遞給祖先,不要 呼叫 inherited;若想保留預設行為則呼叫 inherited 或 DefaultHandler。
  4. 跨執行緒操作 UI 必須用 PostMessage / TThread.Synchronize / TThread.Queue。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved