Borland C++ Builder的API後門 (轉)

worldblog發表於2007-12-07
Borland C++ Builder的API後門 (轉)[@more@]

攔截訊息需要以下幾步:
在表單頭內(如Unit1.h)
1. 在類宣告中建立訊息對映表,把某條訊息的處理權交給自定義的訊息處理。

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(Windows訊息名,TMessage,訊息處理函式名)
MESSAGE_HANDLER(...)
END_MESSAGE_MAP(TForm)

 

2. 在類宣告的private區內宣告訊息處理函式。

private: // User declarations
void __fastcall 訊息處理函式名(TMessage &Message);
在表單檔案內(如Unit1.cpp)

 

3. 寫出訊息處理函式,在這裡實現你需要的功能。比如

void __fastcall MainForm::OnWMHScroll (TMessage &Message)
{
... // 在此加入你自己的程式碼
TForm::Dispatch(&Message);
}


------ 解釋
1. 關於TMessage
TMessage是VCL預定義的結構,定義如下:
struct TMessage
{
unsigned int Msg; 息
int WParam; 引數
int LParam; 字引數
int Result; 息結果
};


2. 關於TForm::Dispatch(&Message)
  自定義的訊息處理函式末尾最好加一句TForm::Dispatch(&Message),這一句的作用是讓訊息繼續傳遞下去。如果沒有這一句,訊息將被完全攔截,VCL類可能由於得不到訊息而無法實現正常功能。

------ 例項一:修改選單
   有一些,主視窗很小,選單也沒有,如果想加入關於或設定對話方塊,最好的辦法是拿系統選單開刀。Windows 中,修改系統選單與實現其他功能一樣,不太容易,也不會太難。但在C++ Builder中,表單類(TForm)沒有提供有關係統選單的任何屬性與方法,實現其他功能易如反掌,而修改系統選單似乎難於上青天。
   還好,Borland公司允許程式設計師自已處理Window訊息,於是機會來了!

一、用Window API函式修改系統選單
  假定表單名為MainForm,設定MainForm::OnCreate()函式:

用GetSystemMenu(MainForm->Handle,false)取得系統選單控制程式碼;
用AppendMenu,DeleteMenu,ModifyMenu函式修改系統選單,把新的ID號賦於自定義的選單項。
  這時執行程式,可以看到系統選單也被修改,但自定義的選單項卻不能被響應。

二、攔截WM_SYMMAND訊息以響應自定義的選單項
在表單標頭檔案內(如Unit1.h)

在表單類定義末尾加入訊息響應表,取得WM_SYSCOMMAND訊息的處理權
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_SYSCOMMAND,TMessage,OnWMSysCommand)
END_MESSAGE_MAP(TForm)
在表單類定義的private區內加入訊息處理函式宣告
private: // User declarations
void __fastcall OnWMSysCommand(TMessage& Message);
在表單檔案內(如Unit1.h)
寫出訊息響應函式
void __fastcall TForm1::OnWMSysCommand(TMessage& Message)
{
if(Message.WParam==ID_SysMenu_MyItem)
{
// Your Code Here, Do Something
}
TForm::Dispatch(&Message);
}
三、完整程式示例

例項二:給跟蹤欄增加OnStartTrack和OnEndTrack事件

  當跟蹤欄用於進度控制時,OnStartTrack和OnEndTrack很可能是你需要的事件。比如在控制多進度的場合,當移動滑塊時,你需要OnStartTrack事件讓播放停止,需要OnEndTrack事件定位新的播放位置。但Borland公司沒有提供這兩個事件,我等程式設計愛好者只好自力更生,打攔截Windows訊息的主意了。

一、攔截WM_HSCROLL訊息,給跟蹤欄增加OnStartTrack和OnEndTrack事件

在表單標頭檔案內(如Unit.h)

在表單類定義末尾加入訊息響應表,把WM_HSCROLL訊息處理權交給OnWMHScroll函式。
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_HSCROLL,TMessage,OnWMHScroll)
END_MESSAGE_MAP(TForm)
在表單類定義的private區內加入OnWMHScroll函式宣告。
private: // User declarations
void __fastcall OnWMHScroll(TMessage &Message);
在表單類定義的private區內加入StartTrack和EndTrack函式宣告。
private: // User declarations
void __fastcall TrackBar1StartTrack(T *Sender);
void __fastcall TrackBar1EndTrack(TObject *Sender);
在表單檔案內(如Unit.cpp)
寫出OnWMHScroll函式,使它能根據訊息引數StartTrack和EndTrack函式,在實際意義上產生OnStartTrack和OnEndTrack事件。
寫出StartTrack和EndTrack函式。
如果是垂直跟蹤欄,把上面的WM_HSCROLL改為WM_VSCROLL即可。

二、完整程式示例

尾聲
  Borland C++ Builder程式設計中,攔截Windows訊息是一項高階程式設計技術,能讓你儘量挖掘Windows的潛力,尤其讓曾用API程式設計的程式設計師感到心慰。攔截Windows訊息是API盡情發揮的舞臺,當VCL不能為你做什麼時,請想起底層的API。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989125/,如需轉載,請註明出處,否則將追究法律責任。

相關文章