不幸的是,MSDN对它不够清楚。我正在编写一个使用全局钩子的程序,我担心如果程序异常终止(崩溃,被用户杀死等)会发生什么。
当流程终止时,Windows是否会自动解除流程安装的全局挂钩?
如果没有,是否可以在另一个进程中调用UnhookWindowsHookEx()来释放钩子? (我想在钩子线程中这样做,如果它检测到安装程序进程已经死了。)
如果答案为否,则在安装程序进程终止时保持全局挂钩处于活动状态并不危险?处理这种情况的标准方法是什么?
我在MSDN中读到UnhookWindowsHookEx()没有释放在其他进程中加载的dll,但它没有说明什么时候会释放dll。 This article in CodeProject似乎暗示当第一条消息到达钩子线程时,dll未被映射(在相应的进程中),所以它就在UnhookWindowsHookEx()调用之后。这是真的吗?
谢谢。
答案 0 :(得分:9)
答案 1 :(得分:0)
如果您的进程终止,则将隐式调用UnhookWindowsHookEx并删除钩子。收到新消息后,消息处理代码将卸载.dll。因此,一些几乎从未收到任何消息的后台进程,仍可能在删除钩子后很长时间就锁定了库。广播WM_NULL消息通常会有所帮助。我喜欢在摘钩后发送几次。
SendNotifyMessage(HWND_BROADCAST, WM_NULL, 0, 0);