我已经看过很多关于 hooking 的教程和文章,但我不是很理解。主要是因为每个示例都使用不同的解决方案。
我知道我将不得不实施一些能够让钩子保持活力的东西。通常它是某种while循环。Q1:如果这个循环在某个有回调的类中,它会阻止线程执行它们吗?
我知道这需要一段时间,但我非常感谢一些解释良好的全局键盘钩子示例。或者只是将我链接到一些带有二进制文件的工作示例。(相信我,过去几个小时我一直在尝试用谷歌搜索它)。
谢谢
我已经看过很多关于 hooking 的教程和文章,但我不是很理解。主要是因为每个示例都使用不同的解决方案。
我知道我将不得不实施一些能够让钩子保持活力的东西。通常它是某种while循环。Q1:如果这个循环在某个有回调的类中,它会阻止线程执行它们吗?
我知道这需要一段时间,但我非常感谢一些解释良好的全局键盘钩子示例。或者只是将我链接到一些带有二进制文件的工作示例。(相信我,过去几个小时我一直在尝试用谷歌搜索它)。
谢谢
我知道我必须实现一些东西来保持钩子活着
不,这不是问题。全局挂钩需要带有回调的 DLL。该 DLL 被注入到所有正在运行的进程中。它将一直加载到进程中,直到您调用 UnHookWindowsHookEx() 或进程终止,以先到者为准。
请注意,您也可以使用 WH_KEYBOARD_LL 挂接键盘。这不是全局挂钩,Windows 会将上下文切换到您的程序并进行回调。它更容易使用,因为您不需要全局挂钩所需的带有注入 DLL 的 IPC 机制。低级挂钩保持活动状态,直到您取消挂钩,拥有消息队列的线程终止或您的进程终止,以先到者为准。
我的网站上有一个带有可下载代码的骨架键盘钩子(请注意页面底部的“下载”按钮)。这篇文章讨论了一些你需要理解的东西,比如共享部分,并告诉你 Kyle Marsh 关于 Win32 钩子的优秀文章(如果 MSDN 上的某个白痴到现在还没有把它拿下来,因为 .netty 不够)。
源代码在示例中,它只需要为它构建一个 makefile/sln(我不知道您将使用什么编译器/版本)。十年来一直在运输商业产品中的代码与该代码非常相似,所以我知道它有效。
请注意,完整性级别问题会降低在 Vista 和 W7 中挂钩的实用性。
您的程序需要在挂钩期间保持活动状态。您的程序是调用 SetWindowsHookEx / UnSetWindowsHookEx (或其他任何名称)的程序。在这些调用之间,您确实会有一个消息循环(这可能是您正在谈论的 while 循环),就像任何典型的 Windows 程序一样。
但是因为您的程序与您正在挂钩的程序是不同的进程,所以您的消息循环不会导致其他进程挂起。它被称为多任务处理:)