posts - 16,  comments - 34,  trackbacks - 0
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 阅读(1448) 评论(2)  编辑 收藏 引用

FeedBack:
# re: 在WinNT上CallNextHookEx忽略第1个参数
2009-03-05 00:49 | 陈梓瀚(vczh)
反正,HWND被映射到一个类指针,这张表写在全局变量里面。HOOK拿到了HWND,去找表,然后找到你自己的类,类里面就有一堆user data了。

所以,只需要一张表。  回复  更多评论
  
# re: 在WinNT上CallNextHookEx忽略第1个参数
2009-03-05 13:38 | OwnWaterloo
@陈梓瀚(vczh)
老兄 你说的是WndPorc吧? WndPorc拿到HWND,然后去查表找this。
上面说了,这是MFC和wxwidgets处理WndProc的方式。

对于HOOK,即使通过LPARAM转型到XXXStruct,拿到一个HWND,也不能保证就有user data。
比如,程序已经是别人写好了,根本无法知道他是否有表。
这时候,就必须HOOK自己想办法找user data了。  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2020年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(8)

随笔档案(16)

链接

搜索

  •  

积分与排名

  • 积分 - 181795
  • 排名 - 123

最新随笔

最新评论

阅读排行榜

评论排行榜