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

Posted

技术标签:

【中文标题】在我的线程上下文中调用“SetWindowsHookEx”函数【英文标题】:make `SetWindowsHookEx` call functions in my thread context 【发布时间】:2010-06-18 16:05:41 【问题描述】:

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

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

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

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

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

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

是否有任何库(最好是开源的)已经实现了这些机制,并且使我能够使用“外观”,例如,每当@ 987654327@出现?

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

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

【问题讨论】:

【参考方案1】:

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

不需要做额外的工作。

【讨论】:

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

以上是关于在我的线程上下文中调用“SetWindowsHookEx”函数的主要内容,如果未能解决你的问题,请参考以下文章

在我的权限上下文提供程序的函数错误中调用了 React 钩子“useSelector”

带有 out 参数的 control.invoke

如果一个 NSManagedObjectContext 实例同时保存在两个线程中怎么办?

Tomcat servlet 应用程序的后台线程 [重复]

Spring @async 子线程上下文多租户

在此上下文中启动了第二个操作