C++ 无法为进程中的所有线程安装挂钩

C++ 无法为进程中的所有线程安装挂钩,c++,windows,winapi,setwindowshookex,C++,Windows,Winapi,Setwindowshookex,我在应用程序中挂接键盘。要求是在过程中钩住键盘的所有线程 我使用了SetWindowsHookExAPI SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)::KeyboardHookProc, hInst, 0); 钩子是为进程中的所有线程创建的。 在调用线程存在之前,这一切正常。一旦调用线程终止,钩子就停止工作 是否有任何方法可以挂接进程而不是进程中的线程。根据MSDN,WH\uuuuuuuuuuuu LL是全局应用的,而不是特定于应用程序的 如果要为特

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

我使用了SetWindowsHookExAPI

SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)::KeyboardHookProc, hInst, 0);
钩子是为进程中的所有线程创建的。 在调用线程存在之前,这一切正常。一旦调用线程终止,钩子就停止工作


是否有任何方法可以挂接进程而不是进程中的线程。

根据MSDN,WH\uuuuuuuuuuuu LL是全局应用的,而不是特定于应用程序的


如果要为特定于进程的线程安装钩子,请使用WH\uuuuu-KEYBOARD

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

低层KeyboardProc SDK文档中的这一细节至关重要:

这个钩子是在安装它的线程的上下文中调用的。调用是通过向安装钩子的线程发送消息来完成的。因此,安装钩子的线程必须有一个消息循环


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

它与全局或特定于应用程序无关。问题是,当调用线程终止时,挂钩也会终止。您是对的,我在ms excel中插入了hooks dll,并通过指定主应用程序窗口的threadId安装了hook,该窗口仅在应用程序退出时终止,并且运行正常。