[英]Intercepting click event for all controls in an app in C# (WinForms)
我想创建一个应用程序来截取我的应用程序的所有形式的所有UI事件,并将它们写入日志。 这些数据可用于查看哪些控件使用最多,顺序是什么等。问题是我希望这是自动发生的,而不需要修改现有的类。
我制作了一个原型,将一个方法附加到表单中所有控件的click事件,但是如何对所有表单执行此操作? 在操作事件时,Reflection需要一个目标对象,但只能轻松访问启动表单。
有没有办法挂钩对象的构造函数? 然后我可以在新表格的所有事件中“注入”我的方法。 或许还有另一种方法可以做到这一点。
提前致谢!
您可以安装邮件过滤器 。
消息过滤器是实现IMessageFilter
的对象。 WinForms为每个通过线程消息循环的消息调用PreFilterMessage
方法。 这足以监视整个应用程序的用户输入(并为您提供操作它的选项)。
在Windows API中,这是使用本地钩子完成的(您可以使用SetWindowsHookEx函数设置本地鼠标钩子)。 这是完成任务的正确方法。 在C#中,您需要使用P / Invoke才能访问SetWindowsHookEx。
还有一项任务是将HWND(窗口句柄)与相应的WinForms控件相匹配。 阅读本文以了解如何执行此操作(通过WM_GETCONTROLNAME消息)。
我想你必须使用Win32的API消息。
您应该能够通过消息过滤器实现您想要的功能 - 无需直接P / Invoke到Win32-API!
有关详细信息,请参阅IMessageFilter
界面上的帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.