全局 Windows 挂钩必须在 DLL 中,因为挂钩将在不同进程的上下文中调用,因此挂钩过程的代码必须注入该进程。但是,有一些限制:
SetWindowsHookEx
可用于将 DLL 注入另一个进程。32位DLL不能注入64位进程,64位DLL不能注入32位进程。如果一个应用程序需要在其他进程中使用钩子,则需要一个 32 位应用程序调用SetWindowsHookEx
将一个 32 位 DLL 注入 32 位进程,一个 64 位应用程序调用SetWindowsHookEx
将一个 64 位 DLL 注入64 位进程。32 位和 64 位 DLL 必须具有不同的名称。
出于这个原因,我宁愿使用低级钩子WH_MOUSE_LL
and WH_KEYBOARD_LL
,而不是WH_MOUSE
and WH_KEYBOARD
。从他们的 文档中可以看出:
这个钩子在安装它的线程的上下文中被调用。通过向安装钩子的线程发送消息来进行调用。因此,安装钩子的线程必须有一个消息循环。
这使我认为这些特定的钩子程序不需要位于单独的 DLL 中,而可以直接存在于连接它们的 EXE 中。但是,文档SetWindowsHookEx
说:
lpfn
[in] 指向钩子程序的指针。如果
dwThreadId
参数为零或指定由不同进程创建的线程的标识符,则该lpfn
参数必须指向 DLL 中的挂钩过程。
没有提到两个低级挂钩的明确例外。
我见过几个使用低级钩子的 .NET 应用程序,它们的钩子过程没有放在单独的 DLL 中。这是另一个暗示这是可以接受的。但是,由于文档禁止这样做,我自己有点害怕这样做。
如果我不使用 DLL 并且只是将这些低级挂钩程序直接放入我的 EXE 中,是否有人预见到任何麻烦?
编辑:对于赏金,我想要一个明确的“是的,这没关系,因为......”或“不,这可能会出错,因为......”。