如何拦截发送到窗口的消息?

Posted

技术标签:

【中文标题】如何拦截发送到窗口的消息?【英文标题】:How do I intercept messages being sent to a window? 【发布时间】:2009-05-09 17:31:40 【问题描述】:

我想拦截发送到不同进程中窗口的消息。做这个的最好方式是什么?使用 WH_GETMESSAGE 挂钩时看不到消息,并且不确定是否可以跨进程进行子类化?任何帮助将不胜感激。

【问题讨论】:

您需要设置系统范围的消息挂钩。 Here is a tutorial. 【参考方案1】:

您需要将自己的代码注入到拥有您希望从中截取消息的窗口的进程中。幸运的是,SetWindowsHookEx() 使这变得相当容易,尽管如果您到目前为止只将它用于进程内连接,一开始您可能会遇到一些麻烦。

我可以推荐两篇关于这个主题的优秀文章:

    Joseph Newcomber 的 Hooks and DLLs 罗伯特·库斯特的Three Ways to Inject Your Code into Another Process

【讨论】:

【参考方案2】:

如果消息是发送而不是发布,WH_GETMESSAGE 将不会看到它。你需要WH_CALLWNDPROC。如果您正在跨进程工作,则需要在 DLL 中使用系统范围的挂钩。你没有提到你是如何调用 SetWindowsHookEx 的,所以我不知道你的钩子失败是因为它不是全局的,还是因为你正在寻找的消息是sent

如果您以前没有使用过系统范围的钩子,我的网站here 上有一个系统范围的钩子示例。那是键盘钩子,但原理是一样的。

如果我无意中在这里说话,请阻止我 - 你的问题太短了,我无法推断你的专业水平。但是搞乱钩子确实意味着一些经验......

【讨论】:

对不起,我应该提供更多细节。我确实得到了 WH_CALLWNDPROC 来读取消息,但是我如何使用它从队列中删除消息?我想阻止一些消息到达目标窗口。 那就不要把消息传给CallNextHookEx 不管我是否调用CallNextHookEx,消息总是到达目标窗口。 :( 来自 MSDN:“CallWndProc 挂钩过程可以检查消息,但不能修改消息。挂钩过程将控制权返回给系统后,将消息传递给窗口过程”。这意味着您可以阻止消息进入下一个 hookproc,但不能阻止接收者窗口。无赖... 可以吞下击键(我已经这样做了),但看起来您无法吞下已发送的消息。抱歉花了这么长时间才看到这个,我一直在外面送婚礼请柬。不,不是我的婚礼 :-)

以上是关于如何拦截发送到窗口的消息?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法拦截 Android SMS 发送以转发到不同的传输?

为什么我无法检测发送到CommonDialog的Windows消息?拦截它们的正确方法是什么?

无法在颤振飞镖中使用 REST API 发送拦截的短信

拔下/切换扩展显示器时是不是有消息发送到应用程序窗口?

kafka 发送数据,如何确定partition源码解释

将击键发送到 PowerPoint 窗口