1

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

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

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

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

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

这对于一个相对简单的类来说是非常复杂的(与 unix 世界中的 XRecord 扩展相比),如果你使用类似Qt.

是否有任何库(最好是开源的)已经实现了这些机制,并使我能够使用“外观”,例如,每当发生 a时,它将在我的线程上下文中WH_KEYBOARD_LL调用一个函数?

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

Qt图书馆可以帮我完成这项任务吗?

4

1 回答 1

3

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

不需要做额外的工作。

于 2010-06-18T19:07:29.413 回答