通常,每当我们想在C++对象中包装窗口/线程时,我们都会通过窗口的SetWindowLong/GetWindowLong或SetProp/GetProp传递this指针,并以lpParameter形式传递CreateThread/etc。
我的问题是专门针对胡克斯的。--传递指向SetWindowsHookEx回调过程的“this”指针的优雅方法是什么,或者换句话说,如何包装钩子的回调过程?
由于SetWindowsHookEx不接受任何UserData参数,所以除了使用未封装的(即全局/静态/TLS数据)之外,我看不出有多少选项。
发布于 2019-04-16 16:00:16
您应该只有一个给定钩子的实例,所以全局数据不是问题。
如果您正在开发允许动态添加或删除多个钩子实例的库,请不要在OS级别添加多个钩子。相反,添加一个库级别的钩子过程,它跟踪钩子实例的列表.由于您维护此列表,您可以跟踪任何“用户数据”与您想要的每个条目。
发布于 2019-04-16 16:05:27
“最优雅的方法”是使用thunk。它是在运行时生成的一小部分代码,用于保存this指针。这是ATL使用的方法,即使在常规窗口中也是如此。
看见
https://stackoverflow.com/questions/55712135
复制相似问题