全局键盘钩与C ++

时间:2010-08-16 09:43:01

标签: c++ windows hook keyboard-hook

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

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

我知道这需要一段时间,但我非常感谢一些解释良好的全局键盘钩子示例。或者只是将我链接到一些带有二进制文件的工作示例。 (相信我,我一直试图谷歌它持续几个小时)。

谢谢

3 个答案:

答案 0 :(得分:3)

  

我知道我必须实施一些可以保持活着的东西

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

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

答案 1 :(得分:2)

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

源代码在示例中,它只需要一个makefile / sln构建(我不知道你将使用什么编译器/版本)。代码与运输商业产品中的代码十分相似,因此我知道它有效。

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

答案 2 :(得分:1)

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

但是因为你的程序与你正在挂钩的程序不同,所以你的消息循环不会导致其他进程挂起。它被称为多任务处理:)