如何确保即使在异常终止时也会调用 UnhookWindowsHookEx?

2024-02-07

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

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

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

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

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

谢谢。


  1. 是的,当一个进程终止时,系统会在它之后进行清理——所有句柄都会隐式关闭。
  2. 不,不是,而且你也不需要这么做。
  3. (是是和不是,不是不是和否)
  4. 我不明白为什么这里涉及到另一个进程中加载​​了一个 DLL。 (EDIT:我最初想到的是一个系统范围的钩子,例如CBTProc http://msdn.microsoft.com/en-us/library/ms644977.aspx-- 如果您的钩子是针对每个进程的,则可能会有所不同)如果您正在处理类似 @Hans 注释中指示的链接的内容,您已将自己的 DLL 注入到目标进程中,那么您应该将功能添加到卸载 DLL 内的挂钩,而不是将其正确操作绑定到您的应用程序。 (即,如果在 DLL 内将消息发送回您的应用程序失败,则您的 DLL 应决定自行卸载)/EDIT当 DLL 被加载到另一个进程中时,由该进程来进行释放。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何确保即使在异常终止时也会调用 UnhookWindowsHookEx? 的相关文章

随机推荐

  • 意图 putExtra ArrayList

    有谁知道如何添加ArrayList
  • Swift:具有多种模式的开关大小写无法绑定到变量

    在官方斯威夫特编程语言 https developer apple com library ios documentation Swift Conceptual Swift Programming Language Statements h
  • 如何将不明确的字符串解析为日期?

    我试图找出一种将字符串解析为日期对象的 简单 方法 该字符串可以是 yyyyMMdd yyyyMMddHHmm 或 yyyyMMddHHmmSS 目前 我正在查看字符串的长度 并根据长度创建一个 DateParser 有没有更优雅的方法来做
  • 使用 SciPy 绘制分位数-分位数图

    如何使用 Python 创建 qq plot 假设您有大量测量值并且正在使用某种以 XY 值作为输入的绘图函数 该函数应根据某些分布 正态分布 均匀分布 的相应分位数绘制测量值的分位数 由此产生的图让我们可以评估我们的测量是否遵循假设的分布
  • 有什么理由使用同步 XMLHttpRequest 吗?

    似乎大多数人都使用 XMLHttpRequest 执行异步请求 但显然 能够执行同步请求的事实表明可能有这样做的正当理由 那么这个合理的理由可能是什么 同步 XHR 对于保存用户数据很有用 如果您处理beforeunload您可以在用户关闭
  • 文本框不可点击但可编辑

    我有一个带有 10 个文本框的小表单 我将它们设置为当前正确的 Tab 顺序 就像我希望它们按 Tab 到的方式一样 我想知道是否有一种方法可以设置文本框 以便它们不能被选择进行编辑 除非它们被选项卡插入 即 我不希望最终用户能够单击文本框
  • 如何在Oracle中定义ON COMMIT触发器?

    oracle数据库中是否有任何方法可以定义触发器 当指定的表发生更改时 该触发器将在提交之前同步触发 如果抛出异常则回滚 Oracle中没有ON COMMIT触发机制 不过 还有一些解决方法 您可以使用带有 ON COMMIT REFRES
  • 您最喜欢的 Windbg 提示/技巧是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 等待文件可供 Win32 读取

    我正在通过调用查看目录ReadDirectoryChangesW同步地 当新文件可用时 我尝试立即访问它CreateFile with GENERIC READ and FILE SHARE READ 但这给了我ERROR SHARING
  • 在MySQL中使用存储过程时遇到两个问题

    下面是我正在其中进行利息计算的存储过程的示例代码 该代码不可执行 因为根据在游标声明之前定义创建临时表块时发现其获取问题 但如果我最近在游标声明之后定义了相同的内容 那么它会成功执行 1 我的问题是我在光标内使用该表 所以我必须在光标后定义
  • 网页抓取,获取空列表

    我很难用我的网络抓取代码找出正确的路径 我正在尝试从中获取不同的信息http financials morningstar com company profile c action t AAPL http financials mornin
  • “ipython”选项卡自动完成功能不适用于导入的模块

    IPython 上的制表符补全似乎不起作用 例如 import numpy numpy
  • 如何使用 FTPS/TLS 1.2 版模拟 FTP 连接?

    我有一个 Python 代码 使用 HTTPS 和 TLS 版本 1 2 从 FTP 读取一些文件 这是函数 凭证是从 AWS 秘密管理器读取的 def ftp connection host username password try f
  • Identity Server 3 - Ajax 调用上的 401 而不是 302

    我有一个 Web api mvc 混合应用程序 我已将其配置为使用 cookie 身份验证 这对于应用程序的 mvc 部分效果很好 Web api 确实强制执行授权 但不是返回401 Unauthorised它返回一个302 Found并重
  • 当我使用 doReturn(..).when(....) 时,PowerMockito 正在调用该方法

    我是 PowerMockito 的新手 它显示的行为我不明白 以下代码解释了我的问题 public class ClassOfInterest private Object methodIWantToMock String x String
  • QT和MFC哪个更好学[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将对象添加到 ArrayList 指定索引处

    我认为这是一个相当简单的问题 但我不知道如何正确地做到这一点 我有一个空的数组列表 ArrayList list new ArrayList 我有一些对象 我想在其中添加对象 并且每个对象必须位于某个位置 然而 有必要将它们按每种可能的顺序
  • Inner Join 是否存在性能问题?

    目前我在我的 sp 中使用了很多内部联接 大约 7 个 它对 sp 性能有任何影响吗 左外连接是否比内连接提供更好的性能 另一件事是 如果我连接两个表 a 和 b 其中列 id 和 id1 都不可为空 我想在这里我可以进行内部联接 因为这些
  • 在 HTML 选择标签中找到默认选择的选项?

    我在网上找到了清除表单的代码 但它没有用于选择框的内容 使用 jquery 当我重置表单时 我尝试添加代码来选择选择框中的默认选项 我认为找到默认值的唯一方法是查找 SELECTED 选项所在的位置 然后我发现 当用户选择其他内容时 jqu
  • 如何确保即使在异常终止时也会调用 UnhookWindowsHookEx?

    不幸的是 MSDN 对此还不够清楚 我正在编写一个使用全局钩子的程序 我担心如果程序异常终止 崩溃 被用户杀死等 会发生什么 当进程终止时 Windows 是否会自动取消进程安装的全局挂钩 如果没有 是否可以在另一个进程中调用UnhookW