应用程序挂钩:: x64系统

时间:2009-05-27 17:31:43

标签: 64-bit hook 32-bit

是否有某种秘密来挂钩64位和64位系统上的32位进程?

在我正在编写的应用程序中,我需要能够挂钩64位进程。挂钩32位进程在64& 32位系统,但尝试挂钩64位应用程序时没有收到任何消息。

在有人告诉我我不应该做这样的事情之前让我解释一下这对我来说是非常必要的事情。如果没有设置全局系统挂钩,我的应用程序将毫无用处/毫无意义。

这个应用程序是用C#/ WPF编写的,但是使用C ++ dll来实现挂钩。我已经尝试为64位系统编译dll,尽管它仍然没有做它应该做的事情。在32位系统上编译并运行时,它的工作原理完全正确。

*编辑::我在谈论挂钩窗口消息 - WH_CBT& WH_SHELL消息

1 个答案:

答案 0 :(得分:3)

为了挂钩32位和64位进程,您需要确保:

  1. 你有32位DLL挂钩32位进程和64位DLL来挂钩64位进程
  2. 从32位代码调用SetWindowsHookEx() 以挂钩32位进程,从64位代码挂钩到挂钩64位进程。
  3. 后者基本上意味着你必须创建32位和64位可执行文件,它们都调用SetWindowsHookEx(),分别提供32位和64位DLL作为hMod参数。

    如果您的应用程序是32位,则必须生成64位进程,该进程将调用SetWindowsHookEx(),并且在您取消挂钩之前可能不执行任何操作。请注意,如果此进程退出/终止,Windows将自动取消设置挂钩,因此它必须在您需要挂钩时保持活动状态,可能是应用程序的整个生命周期 - 在这种情况下,您可以进行64位进程WaitForSingleObject()直到主应用程序进程退出/终止,并在WaitForSingleObject()完成后取消挂起并退出。