在 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 程序的文本框中突出显示文本?
在 C# winforms 应用程序中使用文本框过滤 Treeview