我想制作一个应用程序来拦截我的应用程序所有形式的所有 UI 事件并将它们写入日志。这些数据可以用来查看哪些控件最常用,以什么顺序等。问题是我希望这能自动发生,而不需要修改现有的类。
我制作了一个原型,将方法附加到表单中所有控件的单击事件,但是如何对所有表单执行此操作?反射在操作事件时需要一个目标对象,但只有启动窗体可以方便地访问。
有没有办法挂钩对象的构造函数?然后我可以在新表单的所有事件中“注入”我的方法。或者也许还有另一种方法可以做到这一点。
提前致谢!
我想制作一个应用程序来拦截我的应用程序所有形式的所有 UI 事件并将它们写入日志。这些数据可以用来查看哪些控件最常用,以什么顺序等。问题是我希望这能自动发生,而不需要修改现有的类。
我制作了一个原型,将方法附加到表单中所有控件的单击事件,但是如何对所有表单执行此操作?反射在操作事件时需要一个目标对象,但只有启动窗体可以方便地访问。
有没有办法挂钩对象的构造函数?然后我可以在新表单的所有事件中“注入”我的方法。或者也许还有另一种方法可以做到这一点。
提前致谢!
您可以安装消息过滤器。
消息过滤器是一个实现IMessageFilter
. PreFilterMessage
WinForms为通过线程消息循环的每条消息调用您的方法。这足以监视整个应用程序的用户输入(并为您提供操作它的选项)。
在 Windows API 中,这是使用本地挂钩完成的(您可以使用SetWindowsHookEx函数设置本地鼠标挂钩)。这是完成任务的正确方法。在 C# 中,您需要使用 P/Invoke 才能访问 SetWindowsHookEx。
另一项任务是将 HWND(Windows 句柄)与相应的 WinForms 控件匹配。阅读本文了解如何执行此操作(通过 WM_GETCONTROLNAME 消息)。
另请参阅此问题,该问题与您的问题重复。
我猜你将不得不使用 Win32 的 API 消息。
您应该能够使用消息过滤器实现您想要的- 无需直接 P/Invoke 到 Win32-API!
有关更多信息,请参阅IMessageFilter
界面上的帮助。