LRESULT CallNextHookEx(HHOOK hhk,int nCode,WPARAM wParam,LPARAM lParam);
hhk [in]
Windows 95/98/ME: Handle to the current hook. An application receives this handle as a result of a previous call to the SetWindowsHookEx function.
Windows NT/XP/2003: Ignored.
什么時(shí)候多了一條“Windows NT/XP/2003: Ignored.”???
以前看到一直是
“Identifies the current hook. An application receives this handle as a result of a previous call to the SetWindowsHookEx function. ”
但再翻翻VS2005和2008的文檔、網(wǎng)絡(luò)或者離線MSDN全都統(tǒng)一口徑說(shuō),“Windows NT/XP/2003: Ignored.”
還逮不到M$的把柄了……
改天裝個(gè)VC6的文檔看看CallNextHookEx是怎么說(shuō)的…… 難道真是我記錯(cuò)了?
本來(lái)么,Windows的很多回調(diào)函數(shù)就設(shè)計(jì)得有缺陷——缺少一個(gè)狀態(tài)維持的參數(shù),比如void* user_data
最常見(jiàn)的WndProc就是一例。
一旦一個(gè)特定的WndProc需要同時(shí)作為幾個(gè)窗口的處理函數(shù),不使用靜態(tài)變量(包括global和static)幾乎是不可能辦到的事情。
Charles Petzold的《Programming Windows》當(dāng)中都不乏這樣的例子:需要讓一個(gè)WndProc處理多個(gè)窗口,而不得不使用全局變量。
如果作為最終開(kāi)發(fā)人員,當(dāng)然有權(quán)使用每個(gè)hWnd的USER_DATA。但是庫(kù)不可以這樣做。
所以庫(kù)們想了各種各樣的辦法,主要包括以MFC和wxwidgets為代表的全局映射表,和WTL/ATL為代表的thunk,來(lái)解決WndProc的問(wèn)題。
而在這些有缺陷的回調(diào)函數(shù)中,最嚴(yán)重的就是所有的HookProc。
要求你在HookProc當(dāng)中以SetWindowsHookEx的返回值為第1個(gè)參數(shù)調(diào)用CallNextHookEx,卻不把這個(gè)參數(shù)傳遞給你!
回調(diào)函數(shù)啊!調(diào)用者都不傳,這不是逼人用全局變量么?
雪上加霜的是,它還涉及到了地址空間的問(wèn)題,全局變量還要放在共享節(jié)里才可以。
真是……
本來(lái)打算設(shè)計(jì)一套機(jī)制解決這個(gè)問(wèn)題的。可是M$已經(jīng)悄悄的忽略了CallNextHookEx的第1個(gè)參數(shù)……
posted on 2009-03-04 22:53
OwnWaterloo 閱讀(1659)
評(píng)論(2) 編輯 收藏 引用