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

C++Builder 中 Perform()、SendMessage() 與 PostMessage() 差異解析

     編輯:VC 教學

在 Windows 程式設計中,元件之間的溝通核心是「訊息」。C++Builder 提供了三種發送訊息的方式:VCL 封裝的 Perform()、Win32 API SendMessage() 與 PostMessage()。三者雖然目的相同,但機制、適用場景與同步特性截然不同。

Perform():VCL 內部同步發送

int __fastcall Perform(unsigned Msg, int WParam, int LParam);
  • 適用對象: 所有繼承自 TControl 的元件(擁有 Handle)。
  • 機制: 直接建構 TMessage 記錄,呼叫 Dispatch() 送入元件的訊息處理鏈,**不經過系統訊息佇列**。
  • 同步性: **同步阻塞**——呼叫執行緒會等待訊息處理完畢才返回。
  • 優點: 不需知道視窗控制代碼,直接用元件實例;效能優於 API 呼叫;可存取 VCL 專屬訊息(如 CM_*)。
  • 範例: Edit1->Perform(WM_SETTEXT, 0, (LPARAM)"新文字");

SendMessage():跨視窗同步發送

LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
  • 適用對象: 任何擁有 HWND 的視窗(含非 VCL 視窗、其他程式視窗)。
  • 機制: 直接呼叫目標視窗程序,**繞過系統訊息佇列**。
  • 同步性: **同步阻塞**——發送執行緒等待目標視窗程序處理完畢返回。
  • 風險: 若目標視窗掛死,發送端也會跟著凍結。跨執行緒/進程呼叫需注意死結。

PostMessage():非同步佇列投遞

BOOL PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
  • 機制: 將訊息放入目標執行緒的**系統訊息佇列**,**立即返回**。
  • 同步性: **非同步**——不等待處理結果。
  • 回傳值: TRUE 代表成功放入佇列,不代表訊息已被處理。
  • 適用: 通知類訊息、避免跨執行緒死結、從非 GUI 執行緒向 GUI 執行緒發送訊息。

比較總表

特性Perform()SendMessage()PostMessage()
需 HWND否(元件實例)是是
經過系統佇列否否是
同步/非同步同步同步非同步
跨進程否是是
可發送給非 VCL 視窗否是是
死結風險低高無

最佳實務建議

  • **VCL 元件內部溝通**:優先用 Perform()。
  • **需等待處理結果**(如取得文字長度 WM_GETTEXTLENGTH):用 SendMessage() 或 Perform()。
  • **單純通知、不需回傳值**、或跨執行緒:用 PostMessage()。
  • **跨進程操作他程式視窗**:只能用 SendMessage()/PostMessage()。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved