2010-08-16 120 views
4

我已经看到很多关于钩子的教程和文章,但我不太明白。主要是因为每个示例都使用不同的解决方案。C++的全局键盘钩子

我知道我将不得不实施一些措施,以保持活力。通常这是一种循环。问题1:如果这个循环是在某个带有回调的类中,它会阻止线程执行它们吗?

我知道这将需要一段时间,但我非常感谢一些很好解释的全局键盘钩子的例子。或者干脆将我链接到工作示例与二进制文件。 (相信我,我一直试图谷歌最后几个小时)。

谢谢

+0

什么操作系统? – humbagumba 2010-08-16 09:46:22

+0

Windows 7,Vista分别。 – 2010-08-16 09:49:03

回答

3

我知道我将要实施的东西,将保持钩活

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

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

+0

我试过使用WH_KEYBOARD_LL,但它在几秒钟后停止调用回调。除了循环之外,还有什么窍门让它活着吗? – 2010-08-16 12:16:02

+1

如果您的回调没有在合理的时间内完成,则这是自动的。 Windows决定它有问题并禁用该挂钩。你的回调代码出了问题,无法猜测它可能是什么。 – 2010-08-16 12:18:56

+0

我猜哔(0x500,300);即使调试,速度太慢...... – 2010-08-16 12:20:12

2

有骨骼键盘钩子上我的网站here下载的代码(注意在页面底部的“下载”按钮)。本文将讨论一些您需要了解的内容,例如共享部分,并通知您关于Kyle Marsh在Win32挂钩上的优秀文章(如果MSDN中的一些白痴现在还没有把它拿下来,因为没有足够的.netty)。

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

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

1

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

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