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

Multithreading 在我的线程上下文中调用`SetWindowsHookEx`函数,multithreading,winapi,keylogger,setwindowshookex,Multithreading,Winapi,Keylogger,Setwindowshookex,为了在GUI应用程序中使用SetWindowsHookEx,通常需要在发生事件时在线程中调用函数 因此,例如,如果我正在制作一个软件来显示系统上按下的所有键,我希望我的GUI应用程序能够在按下键时调用函数AddKeyToList(int vkeycode) 我不是Windows内部结构方面的专家,但如果我正确理解了文档,则由SetWindowsHookEx安装的钩子将在导致钩子事件的线程上下文中被调用。因此,为了实现我所描述的目标,需要: 创建一个包含钩子函数的DLL,并在其中创建一个共享内存区

为了在GUI应用程序中使用
SetWindowsHookEx
,通常需要在发生事件时在线程中调用函数

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

我不是Windows内部结构方面的专家,但如果我正确理解了文档,则由
SetWindowsHookEx
安装的钩子将在导致钩子事件的线程上下文中被调用。因此,为了实现我所描述的目标,需要:

  • 创建一个包含钩子函数的DLL,并在其中创建一个共享内存区域,所有线程将通过该区域共享并相互通信

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

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

    是否有任何库(最好是开源库)已经实现了这些机制,并使我能够使用“facade”,例如,每当出现
    who\u KEYBOARD\u LL
    时,它将在线程上下文中调用函数

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


    Qt
    库能帮我完成这项任务吗?

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


    不需要做额外的工作。

    +1用于提及关于不需要在DLL中进行回调的未记录事实