C# 如何使用全局钩子确定按键的主机应用程序?

C# 如何使用全局钩子确定按键的主机应用程序?,c#,winapi,com,hook,keyboard-hook,C#,Winapi,Com,Hook,Keyboard Hook,我对在特定应用程序(如Microsoft Word)的上下文中进行键盘监听感兴趣。谷歌显示,解决这个问题的唯一方法是使用全局键盘挂钩 全局键盘挂钩侦听所有活动应用程序中的所有按键事件。例如,用户在MicrosoftWord中键入文本(我需要捕捉这些事件),同时向Facebook上的朋友发送一些消息。这意味着我的键盘监听器也处理Facebook消息,但这对我来说是多余的信息 所以我的问题是,如何确定最后一个按键的主机应用程序?或者换句话说,我如何确定当前活动的应用程序,以便了解按键位置的“上下文”

我对在特定应用程序(如Microsoft Word)的上下文中进行键盘监听感兴趣。谷歌显示,解决这个问题的唯一方法是使用全局键盘挂钩

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


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

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


最终,反病毒软件可能会开始警告这些类型的钩子,但到目前为止,我编写的使用这些钩子的应用程序已经安装在10万台PC上,我们没有收到任何此类性质的支持电话。尽管这很神奇。

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