在我的线程上下文中调用`SetWindowsHookEx`函数

时间:2010-06-18 16:05:41

标签: multithreading winapi keylogger setwindowshookex

为了在GUI应用程序中使用SetWindowsHookEx,您通常希望在底线中在事件发生时调用线程中的函数。

因此,例如,如果我正在制作一个软件来显示系统上按下的所有键,我希望我的GUI应用程序在按下某个键时会调用函数AddKeyToList(int vkeycode)

我不是Windows内部的专家,但如果我正确理解文档,那么SetWindowsHookEx安装的钩子会在线程的上下文中被调用,导致它们挂钩的事件。所以为了做我描述的,我们需要:

  1. 创建一个包含钩子函数的DLL,并创建一个共享内存区域,所有线程将通过它共享并相互通信。

  2. 在钩子函数和GUI程序中创建一个pInvoke类似的机制。在我们的示例中,钩子函数将按下的键发送到我们的GUI程序,GUI程序将在其自己的上下文中调用AddKeyToList函数。

  3. 对于一个相对简单的类来说这是非常复杂的(与unix世界中的XRecord扩展相比),如果你使用类似Qt的东西,它甚至可能是不可能的。

    是否有任何已经实现了这些机制的库(最好是开源),并且允许我使用“facade”,例如,只要{在我的线程上下文中调用函数 {发生了{1}}?

    我的分析是正确的,还是有更简单的方法来实现我所描述的目标?

    WH_KEYBOARD_LL库可以帮我完成这项任务吗?

1 个答案:

答案 0 :(得分:1)

这已经是WH_KEYBOARD_LL挂钩的默认行为。在与调用SetWindowsHookEx()相同的线程中调用回调。该线程还必须为此提供一个消息循环,以便在使用UI线程时自动正常工作。并且回调代码也不需要存在于DLL中,它不是需要DLL注入的全局钩子。

不需要做额外的工作。