我试图让我的钩子在一个进程中全局工作,当将hMod和dwTID设置为 0时,它使用 _LL (LowLevel) 对我有用。
有没有办法让它在没有 .dll 的情况下工作?
我试图让我的钩子在一个进程中全局工作,当将hMod和dwTID设置为 0时,它使用 _LL (LowLevel) 对我有用。
有没有办法让它在没有 .dll 的情况下工作?
这是不可能的。几乎在 MSDN 上讨论或给出全局挂钩示例的每个地方都提到了该要求。一些例子:
...可以在与调用线程相同的桌面中的任何应用程序的上下文中调用全局挂钩过程,因此该过程必须位于单独的 DLL 模块中。...
...您必须将全局挂钩过程放置在与安装挂钩过程的应用程序分开的 DLL 中。...
...所有全局挂钩函数都必须在库中。...
请注意,原因可能是代码可以根据文档在其他应用程序的上下文中运行,但情况并非总是如此 - 在文档中也提到过。来自SetWindowsHookEx
:
...请注意,可以在安装挂钩的线程上调用 WH_MOUSE、WH_KEYBOARD、WH_JOURNAL*、WH_SHELL 和低级挂钩,而不是在处理挂钩的线程上调用。...
我真的不知道罐头在该声明中的真正含义。是不是有时是这样,有时又是这样,但我只进行了一次测试,并且确实在安装钩子的线程的上下文中调用了钩子过程,从而导致不必要的任何进程间通信。但是,这不会改变对dll的要求。
低级钩子的处理完全不同。正如文档中在某种程度上解释的那样,对钩子的调用是通过向安装了钩子的线程发送消息然后将上下文切换到该线程来完成的——这不需要安装 dll。
澄清一下,WH_KEYBOARD_LL 和 WH_MOUSE_LL 是不需要 dll 的低级全局钩子(其他钩子,如 WH_KEYBOARD 确实需要 dll 才能注入其他进程):
如果您打算挂钩到一个或多个外部进程,则必须在 DLL 内部实现挂钩,因为挂钩代码需要注入这些进程的地址空间,并且只有 DLL 才能做到这一点。
如果您打算只挂钩您自己的调用进程,则不需要 DLL,但您必须SetWindowsHookEx()
在每个线程的基础上调用以安装特定于线程的挂钩,即您必须将值hMod
设置为非零值,例如 from或。NULL
dwThreadId
GetCurrentThreadId()
CreateThread()