前面我們利用現(xiàn)有的微軟ATL實現(xiàn)的thunk已經(jīng)為我們截獲窗口消息做好了準備,此刻我們應(yīng)該編寫我們的Widget驅(qū)動的初步實現(xiàn)了。
利用thunk對窗口消息過程進行子類化,那么窗口消息就會先流入到我們的Widget驅(qū)動對象,Widget驅(qū)動對象負責將消息傳遞給消息過濾器。現(xiàn)在我們的消息過濾器還未實現(xiàn),于是我們打印了進入消息過濾器的消息ID值以觀察消息的流動情況。
以下是我們的Widget驅(qū)動類,我們將其放入了一個名為widget的名字空間中,以后我們widget相關(guān)的名字都會放入到這個名字空間中。
class DriverImpl;
class Driver{
DriverImpl* pImpl_;
public:
explicit Driver(HWND hWnd);
~Driver();
private:
Driver(const Driver&);
Driver& operator =(const Driver&);
public:
inline HWND GetContainerWindow() const;
};
因為Driver的實現(xiàn)我們并不關(guān)心,所以我們將其實現(xiàn)進行了一個隱藏,這樣也便于我們修改其實現(xiàn)方式。Driver類對象要求用于構(gòu)造它的窗口句柄必須為有效的窗口句柄,并且每個窗口句柄只能被驅(qū)動一次,所以我們在調(diào)試版本中做了斷言來約束我們的編碼,在發(fā)布版本中不會做任何判斷。
#ifdef _DEBUG
assert(::IsWindow(hContainerWnd_));
// 不能多次驅(qū)動同一窗口
assert(GetContainerWindows_().insert(hContainerWnd_).second);
#endif // _DEBUG
此處有一個
GetContainerWindows_()是一個只在調(diào)試版本中才有的實現(xiàn),其返回一個std::set<HWND>&靜態(tài)對象引用,用于保存已經(jīng)被驅(qū)動的窗口句柄,我們斷言窗口句柄未曾保存到這個set之中。
現(xiàn)在我們實現(xiàn)的Driver接口非常簡單,只有一個構(gòu)造接口和查詢其驅(qū)動的窗口句柄的接口,顯然沒有任何可以控制驅(qū)動或者解除驅(qū)動的機會,此處我們先放一放,因為這在以后會涉及到這個驅(qū)動所關(guān)聯(lián)的Widget體系的一些問題。
通過thunk截獲的窗口消息將會進入到Driver實現(xiàn)中,Driver的功能僅僅是作為Widget的驅(qū)動(也就是消息驅(qū)動),它不負責任何消息的處理,所以這個窗口過程在截獲到窗口消息后立即交由消息過濾處理。
LRESULT WndProc_(UINT message, WPARAM wParam, LPARAM lParam)
{
// 進行消息過濾
MessageFilter::Param param;
param.hWnd = hContainerWnd_;
param.originalProc = originalProc_;
param.message = message;
param.wParam = wParam;
param.lParam = lParam;
return MessageFilter::Filter(param);
}
這里消息過濾器的實現(xiàn)不在這一段討論之中,所以我們簡單的以一個類靜態(tài)接口來作為過濾入口。
好了,我們到這里已經(jīng)開啟了Widget內(nèi)核的運作系統(tǒng)的實現(xiàn),從測試工程中感受得到一定的體驗了。
下載測試工程源碼

作者: Evil.Ghost 發(fā)表于 2011-04-03 13:56 原文鏈接
評論: 0 查看評論 發(fā)表評論
最新新聞:
· 蘋果iPad 2通過3C認證 最晚5月國內(nèi)上市(2011-04-10 09:18)
· 盲目依賴iPhone等工具導(dǎo)航 英國驢友迷路多(2011-04-10 09:14)
· 趣談:想擔任CEO的話,最好是去蘋果工作,其次是微軟,再才是Google(2011-04-10 08:26)
· 騰訊將建立新數(shù)據(jù)中心,規(guī)模為蘋果的兩倍(2011-04-10 08:25)
· 輕量化的微型博客Tumblr(2011-04-10 08:03)
編輯推薦:非戰(zhàn)之罪,從永中Office談起
網(wǎng)站導(dǎo)航:博客園首頁 我的園子 新聞 閃存 小組 博問 知識庫