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

时间:2010-11-25 17:52:43

标签: c# .net winforms events interception

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

我制作了一个原型,将一个方法附加到表单中所有控件的click事件,但是如何为所有表单执行此操作?在操作事件时,Reflection需要一个目标对象,但只能轻松访问启动表单。

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

提前致谢!

4 个答案:

答案 0 :(得分:7)

您可以安装message filter

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

我猜你必须使用Win32的API消息。

Here's a little example under the form of tutorial

答案 3 :(得分:0)

您应该能够通过message filters - 无法直接P / Invoke到Win32-API来实现您的目标!

有关详细信息,请参阅IMessageFilter界面上的帮助。