【问题标题】:Global keyboard hook with C++使用 C++ 的全局键盘钩子
【发布时间】:2010-08-16 09:43:00
【问题描述】:

我已经看过很多关于 hooking 的教程和文章,但我不是很明白。主要是因为每个示例都使用不同的解决方案。

我知道我必须实现一些东西来保持钩子活着。通常它是某种while循环。 Q1:如果这个循环在某个有回调的类中,它会阻止线程执行它们吗?

我知道这需要一段时间,但我非常感谢一些解释清楚的全局键盘挂钩示例。或者简单地将我链接到一些带有二进制文件的工作示例。 (相信我,过去几个小时我一直在尝试用谷歌搜索它)。

谢谢

【问题讨论】:

  • 分别是Windows 7、Vista。

标签: c++ windows hook keyboard-hook


【解决方案1】:

我知道我必须实现一些东西来让钩子保持活力

不,这不是问题。全局挂钩需要带有回调的 DLL。该 DLL 被注入到所有正在运行的进程中。它将一直加载到进程中,直到您调用 UnHookWindowsHookEx() 或进程终止,以先到者为准。

请注意,您也可以使用 WH_KEYBOARD_LL 挂接键盘。这 不是 全局挂钩,Windows 会将上下文切换到您的程序并进行回调。它更容易使用,因为您不需要全局挂钩所需的带有注入 DLL 的 IPC 机制。低级挂钩保持活动状态,直到您取消挂钩、拥有消息队列的线程终止或您的进程终止,以先到者为准。

【讨论】:

  • 我尝试使用 WH_KEYBOARD_LL,但它会在几秒钟后停止调用回调。除了循环还有什么技巧可以让它保持活力吗?
  • 如果您的回调没有在合理的时间内完成,这是自动的。 Windows 确定它有问题并禁用挂钩。您的回调代码有问题,无法猜测可能是什么。
【解决方案2】:

在我的网站here 上有一个带有可下载代码的骨骼键盘挂钩(请注意页面底部的“下载”按钮)。这篇文章讨论了一些你需要理解的东西,比如共享部分,并告诉你 Kyle Marsh 关于 Win32 钩子的优秀文章(如果 MSDN 上的某个白痴现在还没有把它拿下来,因为 .netty 不够)。

源代码在示例中,它只需要为它构建一个 makefile/sln(我不知道您将使用什么编译器/版本)。十年来一直在运输商业产品中的代码与该代码惊人地相似,所以我知道它可以工作。

请注意,完整性级别问题会降低挂钩在 Vista 和 W7 中的实用性。

【讨论】:

    【解决方案3】:

    您的程序需要在挂钩期间保持活动状态。您的程序是调用 SetWindowsHookEx / UnSetWindowsHookEx (或其他任何名称)的程序。在这些调用之间,您确实会有一个消息循环(这可能是您正在谈论的 while 循环),就像任何典型的 windows 程序一样。

    但是由于您的程序与您正在挂钩的程序是不同的进程,因此您的消息循环不会导致其他进程挂起。这叫做多任务处理:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-27
      • 2010-10-23
      • 1970-01-01
      • 2012-05-26
      • 2010-12-10
      • 2016-04-20
      • 2011-03-29
      • 1970-01-01
      相关资源
      最近更新 更多