12

不幸的是,MSDN 对它不够清楚。我正在编写一个使用全局钩子的程序,我担心如果程序异常终止(崩溃、被用户杀死等)会发生什么。

  1. 当进程终止时,Windows 是否会自动解除进程安装的全局挂钩?

  2. 如果没有,是否可以在另一个进程中调用 UnhookWindowsHookEx() 来释放钩子?(如果它检测到安装程序进程已死,我正在考虑在挂钩线程中执行此操作。)

  3. 如果答案是“否”和“否”,那么当安装程序终止时让全局钩子处于活动状态不是很危险吗?处理这种情况的标准方法是什么?

  4. 我在 MSDN 中读到 UnhookWindowsHookEx() 不会释放在其他进程中加载​​的 dll,但它没有说明何时释放 dll。CodeProject 中的这篇文章似乎表明当第一条消息到达挂钩线程时,dll 未映射(在相应的进程中),因此它大约在 UnhookWindowsHookEx() 调用之后。这是真的吗?

谢谢你。

4

2 回答 2

11
  1. 是的,当一个进程终止时,系统会在它之后进行清理——所有句柄都被隐式关闭。
  2. 不,它不是,而且你也不需要。
  3. (是,不是,不是,不是,不是)
  4. 我不明白为什么这里涉及的另一个进程中加载​​了一个 DLL。(编辑:我最初考虑的是一个系统范围的钩子,例如CBTProc——如果你的钩子是每个进程可能不同的)你自己的 DLL 到目标进程中,那么你应该把卸载钩子的功能放在你的 DLL 中,而不是将它的正确操作绑定到你的应用程序。(即,如果在 DLL 中将消息发送回您的应用程序失败,那么您的 DLL 应该决定自行卸载)/EDIT当 DLL 在另一个进程中加载​​时,由该进程来执行释放。
于 2010-12-18T16:45:13.877 回答
1

如果您的进程终止,则隐式调用 UnhookWindowsHookEx 并删除您的挂钩。收到新消息后,消息处理代码会卸载 .dll。因此,一些几乎从不接收任何消息的后台进程,可能在你的钩子被移除后很长时间内仍然保持库锁定。广播 WM_NULL 消息通常会有所帮助。我喜欢在脱钩后发送几次。

SendNotifyMessage(HWND_BROADCAST, WM_NULL, 0, 0);
于 2019-02-22T19:48:49.080 回答