6

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

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

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

提前致谢!

4

4 回答 4

7

您可以安装消息过滤器

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

于 2010-11-25T18:09:26.007 回答
1

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

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

另请参阅此问题,该问题与您的问题重复。

于 2010-11-25T18:05:52.207 回答
0

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

下面是一个教程形式的小例子

于 2010-11-25T17:59:19.733 回答
0

您应该能够使用消息过滤器实现您想要的- 无需直接 P/Invoke 到 Win32-API!

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

于 2010-11-25T18:07:19.713 回答