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 阅读(1637)
评论(2) 编辑 收藏 引用