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.
什么時候多了一條“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的文檔、網絡或者離線MSDN全都統一口徑說,“Windows NT/XP/2003: Ignored.”
還逮不到M$的把柄了……
改天裝個VC6的文檔看看CallNextHookEx是怎么說的…… 難道真是我記錯了?
本來么,Windows的很多回調函數就設計得有缺陷——缺少一個狀態維持的參數,比如void* user_data
最常見的WndProc就是一例。
一旦一個特定的WndProc需要同時作為幾個窗口的處理函數,不使用靜態變量(包括global和static)幾乎是不可能辦到的事情。
Charles Petzold的《Programming Windows》當中都不乏這樣的例子:需要讓一個WndProc處理多個窗口,而不得不使用全局變量。
如果作為最終開發人員,當然有權使用每個hWnd的USER_DATA。但是庫不可以這樣做。
所以庫們想了各種各樣的辦法,主要包括以MFC和wxwidgets為代表的全局映射表,和WTL/ATL為代表的thunk,來解決WndProc的問題。
而在這些有缺陷的回調函數中,最嚴重的就是所有的HookProc。
要求你在HookProc當中以SetWindowsHookEx的返回值為第1個參數調用CallNextHookEx,卻不把這個參數傳遞給你!
回調函數啊!調用者都不傳,這不是逼人用全局變量么?
雪上加霜的是,它還涉及到了地址空間的問題,全局變量還要放在共享節里才可以。
真是……
本來打算設計一套機制解決這個問題的。可是M$已經悄悄的忽略了CallNextHookEx的第1個參數……
posted on 2009-03-04 22:53
OwnWaterloo 閱讀(1659)
評論(2) 編輯 收藏 引用