Borland C++ Builder的API後門 (轉)
攔截訊息需要以下幾步:
在表單頭內(如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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- (轉貼) C++ Builder 2007六月上市 (C/C++) (News)C++UI
- oracle Forms Builder常用函式 (轉載)OracleORMUI函式
- @Builder.Default 及@BuilderUI
- C++ Builder XE10 關於Panel1屬性的設定C++UI
- 將 SQL轉換成 Laravel Query Builder 程式碼SQLLaravelUI
- API集合:免費、好用、熱門的APIAPI
- App Builder 2022,後設資料整合開發環境APPUI開發環境
- Apple OS X系統中存在可以提升root許可權的API後門APPAPI
- Builder 模式UI模式
- 熱門的常用 API 大全分享API
- 常用的熱門 API 大全分享API
- 熱門好用的API彙總API
- 【api寶庫】熱門免費的api介面彙總API
- c++的進位制轉換C++
- C++中的輾轉相除法C++
- 【C++】C++之型別轉換C++型別
- [轉載][威脅情報]繼LNMP後oneinstack也被新增了後門!LNMP
- C++入門教程C++
- 免費熱門的API大全整理API
- iBackDoor(愛後門)和DroidBackDoor(安後門):同時影響iOS和Android的”後門”SDK?iOSAndroid
- builder.Build()UI
- C++中string轉換為char*型別返回後亂碼問題C++型別
- 1404:我家的門牌號(C C++)C++
- C/C++的轉義字元詳解C++字元
- 熱門API介面分享API
- [譯]沒有 Interface Builder 的生活UI
- API門戶:API經濟持續發展的增長引擎API
- 熱門的免費可用的 API 大全整理API
- 前後端分離之更好的mock你的後端api後端MockAPI
- C++快速入門+20201011C++
- C++入門(2):為何還學C++?C++
- c++ 型別轉換C++型別
- 熱門免費api介面:含物流api,簡訊api,天氣api等API
- 嘔心整理的常用熱門API大全API
- 熱門好用的免費API資源API
- 大家都在用的熱門免費APIAPI
- 分享收藏的熱門免費api介面API
- 精選熱門免費的好用apiAPI
- Java 8 Stream API 轉換到 Kotlin 集合APIJavaAPIKotlin