如何在父窗口之后要求键盘钩子处理消息

Posted

技术标签:

【中文标题】如何在父窗口之后要求键盘钩子处理消息【英文标题】:How to ask keyboard hook to process messages AFTER the parent window 【发布时间】:2015-11-26 08:01:44 【问题描述】:

标题说明了一切。在父窗口处理完传入的键盘消息后,如何让我的键盘钩子处理它们?阅读docs,我发现有一个名为WH_CALLWNDPROCRET 的值正是这样做的,但我需要在那里指定WH_KEYBOARD(当然要使其成为键盘挂钩),并且该值似乎不是位标志,所以我不能将两者结合起来。

背景:我正在为 Word 2013 编写一个加载项,它需要监视某些键并仅在 Word 完成处理这些键之后才采取适当的操作。我正在使用globalmousekeyhook 项目进行挂钩。

【问题讨论】:

听起来是一种非常骇人听闻的方法。我很确定,Word 对象模型会引发您需要注册和响应的事件,而不是走巧合的代码路线,并假设某些键盘输入会触发某些操作。在调试器之外,几乎不需要安装钩子。 @IInspectable:感谢您的意见。我对 Office 开发并不陌生。这是 Word 对象模型不会为 KeyPress 引发任何事件的关键(也是众所周知的)问题之一(我们得到的最好的是WindowSelectionChanged 事件,但这是另一回事)。到目前为止,钩子似乎是这种东西的唯一途径。例如,请参阅this SO question 的接受答案。 【参考方案1】:

您所指的库订阅了以下四个钩子:

WH_KEYBOARD_LL WH_KEYBOARD WH_MOUSE_LL WH_MOUSE

当你订阅一个钩子时,你给系统一个回调你的代码,它将根据不同钩子类型的不同规则执行。回调将传递给您的信息也必须有不同的解释。这 4 个提供有关鼠标位置、击键等的信息。

您可以订阅许多不同类型的挂钩。见:Hook Overview

你所指的WH_CALLWNDPROCRET就是其中之一。它具有不同的回调调用行为并将所有发送到窗口的消息传递给您。这些理论上可能包括数百种可能的消息中的任何一种,而不仅仅是键盘和鼠标消息。

要回答您的问题,库 globalmousekeyhook 不能订阅除上述 4 个以外的任何其他钩子。

好消息是您可能可以重用库中的代码来实现您自己的订阅。

您可以重复使用代码来安装挂钩。 您的回调签名当然会有所不同。 然后您将收到所有消息。 仅过滤掉您感兴趣的消息,例如WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP。 解释与消息一起传递的数据。您还可以在这里重用库中的一些代码。

结论 不,图书馆不能做你正在寻找的东西。 是的,您可能可以通过重用该库中的代码来实现。

【讨论】:

谢谢。你总结得很好(虽然不是我想听到的,哈哈)。让我们看看我是否可以收集足够的信念和时间来遵循您所展示的道路。 :)

以上是关于如何在父窗口之后要求键盘钩子处理消息的主要内容,如果未能解决你的问题,请参考以下文章

基于键盘钩子实现扫码枪输入

C# WinForm键盘钩子

钩子注入的原理机制

C++怎样简单实现全局钩子或者键盘监控

钩子编程(HOOK) 安装进程内键盘钩子

delphi 键盘全局钩子