全局键盘钩子与C ++

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

我知道我将不得不实施一些能够保持活力的东西。 通常这是一种循环。 Q1:如果这个循环在callback函数的某个类中,是否会阻止线程执行它们?

我知道这将需要一段时间,但我会高度赞赏一些很好解释的全球键盘钩子的例子。 或者简单地把我和一些可执行的例子联系起来。 (相信我,我一直试图谷歌过去几个小时)。

谢谢

Solutions Collecting From Web of "全局键盘钩子与C ++"

我知道我将不得不实施一些能够保持活力的东西

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

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

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

源代码是在这个例子中,它只需要一个makefile / sln构建它(我不知道你将使用什么编译器/版本)。 代码与在运输商业产品十年以来一直很相似,所以我知道它是有效的。

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

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

但是因为你的程序是一个不同于你挂钩的程序,你的消息循环不会导致其他进程挂起。 这就是所谓的多任务:)