代码之家  ›  专栏  ›  技术社区  ›  Mikulas Dite

用C++实现全局键盘钩子

  •  4
  • Mikulas Dite  · 技术社区  · 15 年前

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

    我知道我得做点什么才能保住钩子。通常是一种while循环。问题1:如果这个循环是在某个类中的回调,它会阻止线程执行它们吗?

    我知道这将需要一段时间,但我会非常感谢一些解释良好的例子,全球键盘钩。或者干脆把我和 工作 以二进制文件为例(相信我,过去几个小时我一直在用谷歌搜索它)。

    3 回复  |  直到 15 年前
        1
  •  3
  •   Hans Passant    15 年前

    我知道我得做点什么才能保住钩子

    不,这不重要。全局钩子需要带有回调的DLL。在所有正在运行的进程中都会注入该DLL。在调用UnHookWindowsHookEx()或进程终止(以先到者为准)之前,它将一直加载在进程中。

    请注意,您也可以用WH\u keyboard LL钩住键盘。那是 一个全局钩子,Windows会将上下文切换到你的程序并进行回调。它更容易使用,因为您不需要一个带有全局钩子所需的注入DLL的IPC机制。低级钩子保持活动状态,直到您解除钩子、拥有消息队列的线程终止或进程终止(以先到者为准)。

        2
  •  2
  •   Bob Moore    15 年前

    我的网站上有一个带有可下载代码的骨架键盘挂钩 here

    源代码在示例中,它只需要一个makefile/sln构建(我不知道您将使用什么编译器/版本)。代码惊人地类似于已经在运输商业产品十年了,所以我 知道

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

        3
  •  1
  •   tenfour    15 年前

    你的程序需要在挂接期间保持活动状态。您的程序是一个调用SetWindowsHookEx/UnSetWindowsHookEx(或任何它被调用的东西)的程序。在这些调用之间,确实会有一个消息循环(这可能是您所说的while循环),就像任何典型的windows程序一样。

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

    推荐文章