全局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 WH_KEYBOARD_LL ,而不是 WH_MOUSE WH_KEYBOARD 。从他们的 文档

  

此钩子在上下文中被调用   安装它的线程。电话   是通过发送消息到   安装钩子的线程。   因此,安装的线程   钩子必须有一个消息循环。

这让我认为这些特定的钩子程序不需要在一个单独的DLL中,并且可以只存在于连接它们的EXE中。 SetWindowsHookEx 的文档说:

  

<代码> lpfn

     

[in]指向钩子程序的指针。如果 dwThreadId 参数   为零或指定标识符   由不同的线程创建的线程   进程, lpfn 参数必须指向   到DLL中的钩子程序。

没有提到两个低级别钩子的明确例外。

我见过几个使用低级钩子的.NET应用程序,而没有在单独的DLL中使用它们的钩子程序。这是另一个提示,这是可以接受的。但是,由于文档禁止它,我自己有点害怕这样做。

如果我不使用DLL并且只是将这些低级钩子程序直接放入我的EXE中,是否有人预见到任何问题?

修改:对于赏金,我想要一个明确的“是的,这没关系,因为......”或者“不,这可能会出错,因为......”。

其他提示

事实证明, 实际上是在文档中。虽然不在 SetWindowsHookEx 和朋友的文档中,但在 .NET知识库中文章

  

在安装挂钩的线程上调用低级挂钩过程。低级挂钩不要求在DLL中实现挂钩过程。

全局钩子,无论是低级别还是高级别,都必须位于可以加载到每个进程的单独DLL中。您引用的文档非常清楚,如果有一个异常应用于低级别的钩子,那么文档也会这样说。

经验法则:当文档说不做某事时,通常有一个很好的理由。虽然它可能在某些情况下有效,但它的工作原理可能是一个实现细节,并且可能会发生变化。如果发生这种情况,那么如果实施被修改,您的代码将被破坏。

编辑:我收回我之前的回答。事实证明,WH_MOUSE_LL和WH_KEYBOARD_LL是关于全局钩子的通常规则的例外:

传递给SetWindowsHookEx的HINSTANCE用于什么?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top