【问题标题】:not able to install hooks for all threads in a process无法为进程中的所有线程安装挂钩
【发布时间】:2009-11-24 09:57:41
【问题描述】:

我在应用程序中挂接键盘。要求是在进程的所有线程中钩住键盘。

我使用了 SetWindowsHookEx API

SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)::KeyboardHookProc, hInst, 0);

钩子是为所有进程中的线程创建的。 这工作正常,直到调用线程存在。一旦调用线程终止钩子停止工作。

有什么方法可以挂在进程上而不是进程中的线程。

【问题讨论】:

    标签: c++ windows winapi setwindowshookex


    【解决方案1】:

    SDK 文档中针对 LowLevelKeyboardProc 的详细说明至关重要:

    这个钩子在安装它的线程的上下文中被调用。通过向安装钩子的线程发送消息来进行调用。所以,安装hook的线程一定是有消息循环的。

    换句话说,您必须保持线程处于活动状态,并且线程必须泵送消息循环。您现在看到的行为完全是设计使然。

    【讨论】:

      【解决方案2】:

      根据 MSDN,WH__KEYBOARD___LL 是全局应用的,而不是特定于应用程序的。

      如果您想为特定进程的线程安装钩子,请使用 WH___KEYBOARD

      【讨论】:

      • 它与全局或应用程序无关。问题是当调用线程终止时,挂钩也终止。
      • 你是对的,我已经在 ms excel 中注入了 hooks dll,我已经通过指定主应用程序窗口的 threadId 安装了 hook,该窗口仅在应用程序退出时才终止并且它工作正常。
      【解决方案3】:

      只需在主函数中安装钩子即可。如果仅在特定线程运行时才需要它,则可以使用 volatile 标志。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多