假设我有一个Windows挂钩程序,我使用SetWindowsHookEx
在特定线程上安装。当我随后调用UnhookWindowsHookEx
时,我的DLL是否包含从目标应用程序中卸载的钩子程序?
我在这个主题上找到的大多数documentation似乎暗示调用SetWindowsHookEx
会导致在目标应用程序中隐式调用LoadLibrary
。此外,文档还非常谨慎地指出,在全局 Windows挂钩上调用UnhookWindowsHookEx
并不会从可能已加载它的所有进程中隐式释放库,但是不会在特定于线程的钩子的主题。我要么不仔细阅读文档,要么我的网络搜索能力让我失望。
答案 0 :(得分:1)
特定于线程的钩子和全局钩子之间没有区别。线程ID参数只是一个过滤器,它决定了钩子的应用位置 - 它不会改变钩子规则。
因此,线程ID参数适用于不同的进程,并且适用与全局情况相同的规则 - 您无法安全地将FreeLibrary
调用注入另一个进程,或者线程ID是您的一部分进程,没有理由调用LoadLibary
,因为在调用SetWindowsHookEx
之前已经加载了DLL。 (或者你为实例传递NULL,在这种情况下没有DLL)
我怀疑文档是使用“全局”来表示进程和“线程”正在进行中,因为这将是正常情况。挂钩另一个进程的单个线程将是一个罕见的事件(但似乎得到支持。请参阅remarks。)'
这当然只是在文档的各行之间阅读。
答案 1 :(得分:0)
根据我的研究,UnhookWindowsHookEx不会卸载.dll。收到新消息后,将由消息处理代码将其卸载。因此,一些几乎从未收到任何消息的后台进程,仍可能在删除钩子后很长时间就锁定了库。广播WM_NULL消息通常会有所帮助。我喜欢在摘钩后发送几次。
SendNotifyMessage(HWND_BROADCAST, WM_NULL, 0, 0);