【问题标题】:How do I determine the host application of a pressed key using a global hook?如何使用全局挂钩确定按键的主机应用程序?
【发布时间】:2013-03-12 10:12:02
【问题描述】:

我对在 Microsoft Word 等特定应用程序的上下文中进行键盘监听很感兴趣。谷歌搜索表明,解决此问题的唯一方法是使用全局键盘挂钩。

全局键盘挂钩监听所有活动应用程序中的所有按键事件。例如,用户在 Microsoft Word 中输入文本(我需要捕捉这些事件),同时在 Facebook 上给他的朋友写一些消息。这意味着我的键盘监听器也处理 Facebook 消息,但这对我来说是多余的信息。

所以我的问题是,如何确定最后按下的键的主机应用程序?或者换句话说,我如何确定当前活动的应用程序以了解按键被按下的“上下文”?

【问题讨论】:

  • 如果您想跟踪任何应用程序中发生的关键事件,则需要一个全局挂钩,但如果您需要与其中一个进行交互像 Microsoft Word 这样的单个应用程序,您可能最好使用 Word 特定的机制来实现这一点。例如,某种加载项在与 Word 相同的上下文中运行,并且只在 Word 接收事件时接收事件。
  • 可能是GetForegroundWindow 并检查 Microsoft Word 是否是活动窗口。然后,如果不是用户正在处理的窗口,您的键盘侦听器可以忽略所有按键。
  • 关于“特定于 Word 的机制” - 我已经在开发 COM 插件,但不幸的是,开发人员没有工具来处理按键事件。谷歌说 - 全局键盘挂钩或宏。但是没有人回答我之前在 stackoverflow 上关于使用 MS Word 宏进行按键监听的问题。这就是为什么我要询问全局键盘挂钩上下文。关于 GetForegroundWindow - 谢谢,我试试看。
  • 不需要安装全局钩子。您可以为您感兴趣的线程安装一个线程钩。

标签: c# winapi com hook keyboard-hook


【解决方案1】:

如果 GetForegroundWindow 的想法不适合您。由于您已经有一个使用 Word 加载的 COM 插件SetWindowsHookEx,因此最后一个参数允许您传入线程 ID。因此,在您的 COM 插件中,您可以为 Word 使用的每个线程添加一个挂钩,或者通过反复试验找出您需要挂钩的线程。 DllMain(或 DllEntryPoint)可以收到所有新线程的通知,因此这可能是设置和释放钩子的好地方。

最终,防病毒软件可能会开始对这些类型的挂钩发出警告,但到目前为止,我编写的使用它们的应用程序已安装在 100,000 台 PC 上,而且我们已经收到了此类性质的零支持调用。真是太神奇了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    相关资源
    最近更新 更多