Winapi 我可以将LowLevel MouseProc和LowLevel KeyboardProc放在主EXE中吗?

Winapi 我可以将LowLevel MouseProc和LowLevel KeyboardProc放在主EXE中吗?,winapi,hook,low-level,Winapi,Hook,Low Level,全局Windows钩子必须位于DLL中,因为钩子将在不同进程的上下文中调用,因此钩子过程的代码必须注入该进程。然而,有: SetWindowsHookEx可用于注入 将DLL插入另一个进程。32位 无法将DLL注入到64位 进程,并且不能创建64位DLL 注入32位进程。如果 应用程序需要使用挂钩 在其他过程中,它是必需的 这是一个32位的应用程序调用 SetWindowsHookEx插入32位 DLL转换为32位进程,并 64位应用程序调用 SetWindowsHookEx以插入64位 DLL

全局Windows钩子必须位于DLL中,因为钩子将在不同进程的上下文中调用,因此钩子过程的代码必须注入该进程。然而,有:

SetWindowsHookEx
可用于注入 将DLL插入另一个进程。32位 无法将DLL注入到64位 进程,并且不能创建64位DLL 注入32位进程。如果 应用程序需要使用挂钩 在其他过程中,它是必需的 这是一个32位的应用程序调用
SetWindowsHookEx
插入32位 DLL转换为32位进程,并 64位应用程序调用
SetWindowsHookEx
以插入64位 DLL转换为64位进程。32位 和64位DLL必须具有不同的 名字

因此,我宁愿使用低级挂钩
WH\u MOUSE\u LL
WH\u KEYBOARD\u LL
,而不是
WH\u MOUSE
WH\u KEYBOARD
。从以下方面看:

这个钩子是在 安装它的线程。电话 是通过向 安装挂钩的螺纹。 因此,安装的线程 钩子必须有一个消息循环

这让我想到,这些特定的钩子过程不需要在单独的DLL中,只需要存在于连接它们的EXE中即可。然而,报告说:

lpfn

指向钩子过程的[in]指针。如果
dwThreadId
参数 为零或指定的标识符 由其他线程创建的线程 过程中,
lpfn
参数必须指向 连接到DLL中的钩子过程

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

我见过几个.NET应用程序使用低级钩子,而没有将钩子过程放在单独的DLL中。这是另一个可以接受的暗示。然而,我有点害怕自己做这件事,因为文档禁止这样做

如果我不使用DLL,只是将这些低级钩子过程直接放入我的EXE中,有人预见到会有什么麻烦吗


编辑:对于赏金,我想要一个明确的“是的,这没问题,因为…”或“不,这可能会出错,因为…”。

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

dll规则中的全局挂钩函数有一个异常。低级鼠标和键盘钩子是在调用进程的上下文中执行的,而不是被钩子的进程(在内部,Windows通过Windows消息通知钩子)。因此,钩子代码不会在任意进程中执行,可以在.Net中编写。有关示例,请参见


对于其他钩子,您确实需要调用32位版本的SetWindowsHookEx并在32位进程中传递钩子函数,调用64位版本的SetWindowsHookEx并在64位进程中传递钩子函数。

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

编辑:我收回我以前的答案。事实证明,WH_鼠标和WH_键盘是关于全局钩子的常规规则的例外:

事实证明,这实际上在文档中。虽然不在
SetWindowsHookEx
和friends的文档中,但在中

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


我认为你应该更仔细地阅读这个问题。如果这确实是一个要求,那么.NET应用程序如何成功地使用低级钩子呢?这个问题与全局钩子AFAICT有关。“有一个消息循环”并不意味着它不能是一个实现它的DLL;出于各种原因,我已经完成了几个创建消息循环的DLL。我不知道.NET应用程序是否可以或确实使用低级钩子,因为我从来没有见过或听说过这样的钩子。不过,我猜,如果他们能够并且确实这样做了,他们就是在DLL中使用不安全的代码来实现这一点,但正如我所说的,我猜是这样的。:-)