【问题标题】:SetWindowsHookEx for WH_KEYBOARD (Global) Without using Dll?SetWindowsHookEx for WH_KEYBOARD (Global) 不使用 Dll?
【发布时间】:2013-01-29 09:38:48
【问题描述】:

我正在尝试让我的钩子在一个进程中全局工作,当我将 hModdwTID 设置为 0 时,它使用 _LL (LowLevel) 对我有用.

有没有办法让它在没有 .dll 的情况下工作?

【问题讨论】:

  • “没有 DLL”是什么意思?请尝试详细说明您的具体情况。
  • 您需要一个 DLL,因为该 DLL 将被加载到每个运行并需要调用钩子的进程中。该钩子不会在您的 EXE 上下文中被调用,并且您将与您自己的 exe “交谈”很有趣!看到这个:stackoverflow.com/questions/9550074/…
  • @DavidHeffernan:Cosmin 理解我...
  • @CosminPrund:出于好奇,LowLevel 怎么不需要 .dll?
  • @SertacAkyuz 是的,我应该睁开双眼 :o)

标签: delphi setwindowshookex


【解决方案1】:

这是不可能的。几乎在 MSDN 上讨论或给出全局挂钩示例的每个地方都提到了该要求。一些例子:

Hook Procedures

... 全局挂钩过程可以在任何上下文中调用 应用程序与调用线程位于同一桌面,因此 过程必须在单独的 DLL 模块中。 ...


Installing and Releasing Hook Procedures

...您必须将全局挂钩过程放置在与 安装钩子程序的应用程序。 ...


SetWindowsHookEx function (Windows)

... 所有全局挂钩函数都必须在库中。 ...


请注意,原因可能是 代码可以根据文档在其他应用程序的上下文中运行,但情况并非总是如此 - 在文档中也提到过。来自SetWindowsHookEx

... 请注意 WH_MOUSE、WH_KEYBOARD、WH_JOURNAL*、WH_SHELL 和 可以在安装钩子的线程上调用低级钩子 而不是处理钩子的线程。 ...

我真的不知道 can 在该声明中的真正含义。是不是有时是这样,有时又是这样,但我只进行了一次测试,并且确实在安装钩子的线程的上下文中调用了钩子过程,从而导致不必要的任何进程间通信。然而,这不会改变对 dll 的要求。


低级钩子的处理完全不同。正如documentation 在某种程度上解释的那样,对钩子的调用是通过向安装了钩子的线程发送消息然后将上下文切换到该线程来完成的——这不需要安装 dll。

【讨论】:

    【解决方案2】:

    澄清一下,WH_KEYBOARD_LL 和 WH_MOUSE_LL 是不需要 dll 的低级全局钩子(其他钩子如 WH_KEYBOARD 确实需要 dll 才能注入其他进程):

    Applying low-level keyboard hooks with Python and SetWindowsHookExA

    【讨论】:

      【解决方案3】:

      如果您打算挂钩到一个或多个外部进程,则必须在 DLL 内部实现挂钩,因为挂钩代码需要注入这些进程的地址空间,并且只有 DLL 才能做到。

      如果你打算只挂钩你自己的调用进程,你不需要一个DLL,但你必须在每个线程的基础上调用SetWindowsHookEx()来安装线程特定的挂钩,即你必须设置hMod将值设置为 NULL,并将 dwThreadId 参数设置为非零值,例如来自 GetCurrentThreadId()CreateThread()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-17
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多