非視覺元件(繼承自 TComponent)沒有視窗控制代碼(HWND),因此無法直接接收 Windows 訊息。解決之道是為元件建立一個隱藏視窗,並指派自訂的視窗程序(WndProc)來處理訊息。本文以建立 TTest 元件為例,完整示範實作步驟。
void __fastcall WndProc(TMessage &Msg)。FHandle = AllocateHWnd(WndProc) 建立視窗並綁定處理函數;在解構函式中呼叫 DeallocateHWnd(FHandle) 釋放。class PACKAGE TTest : public TComponent {
private:
HWND FHandle;
void __fastcall WndProc(TMessage &Msg);
protected:
public:
__fastcall TTest(TComponent* Owner);
__fastcall ~TTest();
void DoIt(); // 測試用公有方法
__published:
};
__fastcall TTest::TTest(TComponent* Owner) : TComponent(Owner) {
FHandle = AllocateHWnd(WndProc); // 建立隱藏視窗
}
__fastcall TTest::~TTest() {
DeallocateHWnd(FHandle); // 釋放視窗
}
void __fastcall TTest::WndProc(TMessage &Msg) {
// 這裡處理自訂訊息或系統訊息
// 例如:if (Msg.Msg == WM_MYCUSTOM) { ... }
// 必須呼叫預設處理以避免訊息丟失
// 但非視覺元件通常無預設視窗程序,視需求決定
}
void TTest::DoIt() {
// 測試:向自己發送訊息
PostMessage(FHandle, WM_USER + 1, 0, 0);
}
RegisterHotKey)。PostMessage)。WM_DEVICECHANGE)。此技巧是 VCL 內部元件(如 TTimer、TApplication)處理訊息的基礎機制,掌握它能讓你開發功能更強大的非視覺元件。