在 C# (WinForms) 中拦截应用程序中所有控件的单击事件

Posted

技术标签:

【中文标题】在 C# (WinForms) 中拦截应用程序中所有控件的单击事件【英文标题】:Intercepting click event for all controls in an app in C# (WinForms) 【发布时间】:2011-05-15 20:24:01 【问题描述】:

我想制作一个应用程序来拦截我应用程序所有形式的所有 UI 事件并将它们写入日志。这些数据可以用来查看哪些控件最常用,以什么顺序等。问题是我希望这自动发生,而不需要修改现有的类。

我制作了一个原型,它为表单中的所有控件的点击事件附加了一个方法,但是如何为所有表单做到这一点呢?反射在操作事件时需要一个目标对象,但只有启动窗体可以方便地访问。

有没有办法挂钩对象的构造函数?然后我可以在新表单的所有事件中“注入”我的方法。或者也许还有其他方法可以做到这一点。

提前致谢!

【问题讨论】:

【参考方案1】:

您可以安装message filter。

消息过滤器是一个实现IMessageFilter 的对象。 WinForms 为通过线程消息循环的每条消息调用您的PreFilterMessage 方法。这足以监控整个应用程序中的用户输入(并为您提供操作它的选项)。

【讨论】:

【参考方案2】:

在 Windows API 中,这是使用本地挂钩完成的(您可以使用 SetWindowsHookEx 函数设置本地鼠标挂钩)。这是完成任务的正确方法。在 C# 中,您需要使用 P/Invoke 才能访问 SetWindowsHookEx。

另外一项任务是将 HWND(Windows 句柄)与相应的 WinForms 控件匹配。 阅读this article 了解如何执行此操作(通过 WM_GETCONTROLNAME 消息)。

另请参阅this question,这是您的副本。

【讨论】:

【参考方案3】:

我猜你将不得不使用 Win32 的 API 消息。

Here's a little example under the form of tutorial.

【讨论】:

【参考方案4】:

您应该能够使用 message filters 实现您想要的 - 无需直接 P/Invoke 到 Win32-API!

更多信息请查看IMessageFilter界面上的帮助。

【讨论】:

以上是关于在 C# (WinForms) 中拦截应用程序中所有控件的单击事件的主要内容,如果未能解决你的问题,请参考以下文章

C# 中 WCF 和 MVC Web API 的通用请求响应拦截器

在 C# Winforms 应用程序中嵌入 CMD 终端

如何在 C# Winforms 程序的文本框中突出显示文本?

在 C# winforms 应用程序中使用文本框过滤 Treeview

如何在 C# Winforms 的下拉列表控件中获取数据源名称

如何在 C# 控制台或 WinForms 应用程序中使用 Windows 安全的确认证书弹出窗口选择证书?