0

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

在我目前正在编写的应用程序中,我需要能够挂钩 64 位进程。挂钩 32 位进程在 64 位和 32 位系统上工作得很好,但是在尝试挂钩 64 位应用程序时不会收到任何消息。

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

此应用程序是用 C#/WPF 编写的,但是使用 C++ dll 来执行实际的挂钩。我已经尝试为 64 位系统编译 dll,尽管它仍然没有做它应该做的事情。当为 32 位系统编译和运行时,它完全可以正常工作。

*编辑:: 我说的是挂钩窗口消息 - WH_CBT & WH_SHELL 消息

4

1 回答 1

3

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

  1. 你有 32 位 DLL 来挂钩 32 位进程和 64 位 DLL 来挂钩 64 位进程
  2. 从 32 位代码调用SetWindowsHookEx()以挂接 32 位进程,从 64 位代码调用以挂接 64 位进程。

后者基本上意味着您必须创建都调用 SetWindowsHookEx() 的 32 位和 64 位可执行文件,分别提供 32 位和 64 位 DLL 作为 hMod 参数。

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

于 2009-07-08T13:07:11.203 回答