问题出在标题中:如何让SetWinEventHook
的回调有一些上下文信息?通常采用回调的函数也会将它们传递给回调的上下文参数,但不会传递给回调函数。
例如,使用SetWinEventHook with custom data中建议的全局(包括thread_local
)变量几乎肯定是不可接受的。
实用程序函数可能有多个调用者将WinEvent挂钩设置为执行全局操作。 thread_local
可以工作,但也可能没有。如果回调调用相同的实用程序函数并设置另一个挂钩怎么办?下次我发消息时,它们都会被调用。使用thread_local
要求我定义一个合同,禁止单个线程通过我设置多个WinEvent钩子,并要求我的调用者遵守它。这是一个非常随意和人为的限制,我宁愿不设置它。
我在C ++中重新实现了我在C#中使用的一点PoC。在那里,我可以简单地使用捕获lambda,它们将转换为我可以通过P / Invoke传递给SetWinEventHook
的函数指针。不幸的是,C ++没有这个功能(可能是因为它需要分配WX内存并动态生成一些代码,某些平台不允许这样做),但也许有一种特定于平台的方法可以做到这一点?
我似乎记得过去ATL做过类似的事情,我想我也可以实现类似的东西,但也许有更好的方法呢?如果没有,也许有人已经写过这样的东西了吗?
(另一个有效的解决方案是一个足够聪明的数据结构和算法来解决重入问题。)