我正在尝试让我的钩子在一个进程中全局工作,当我将 hMod 和 dwTID 设置为0时,它对我使用了_LL(LowLevel)
有没有办法让它在没有.dll的情况下工作?
答案 0 :(得分:6)
这是不可能的。几乎在每个讨论或提供MSDN上的全局挂钩示例的地方都提到了这个要求。一些例子:
...可以在任何上下文中调用全局钩子过程 应用程序在与调用线程相同的桌面上,所以 过程必须在单独的DLL模块中。 ...
Installing and Releasing Hook Procedures
...您必须将一个全局挂钩过程放在一个独立于的DLL中 应用程序安装钩子程序。 ...
SetWindowsHookEx function (Windows)
...所有全局钩子函数必须在库中。 ...
请注意,原因可能是代码可以根据文档在其他应用程序的上下文中运行,但情况并非总是如此 - 文档中也提到了这一点。来自SetWindowsHookEx
:
...请注意WH_MOUSE,WH_KEYBOARD,WH_JOURNAL *,WH_SHELL和 可以在安装挂钩的线程上调用低级挂钩 而不是处理钩子的线程。 ...
我真的不知道能在该陈述中的真正含义。它有时是那种方式,有时是另一种方式,但我只进行了一次测试,并且在安装钩子的线程的上下文中确实调用了钩子过程,从而不需要任何进程间通信。但这并不会改变 dll 的要求。
低水平钩子的处理完全不同。正如在documentation中某种程度上所解释的那样,对钩子的调用是通过向安装了钩子的线程发送消息然后将上下文切换到该线程来完成的 - 这不需要安装dll。
答案 1 :(得分:2)
只是为了澄清,WH_KEYBOARD_LL和WH_MOUSE_LL是不需要dll的低级全局钩子(像WH_KEYBOARD这样的其他钩子需要一个dll注入其他进程):
Applying low-level keyboard hooks with Python and SetWindowsHookExA
答案 2 :(得分:0)
如果要挂钩到一个或多个外部进程,则必须在DLL内部实现钩子,因为需要将钩子代码注入到这些进程的地址空间中,并且只有DLL可以执行此操作。
如果你想挂钩你自己的调用进程,你不需要一个DLL,但你必须在每个线程的基础上调用SetWindowsHookEx()
来安装特定于线程的钩子,即你必须设置{ {1}} {}为hMod
,NULL
参数为非零值,例如来自dwThreadId
或GetCurrentThreadId()
。