【问题标题】:Intercepting click event for all controls in an app in C# (WinForms)在 C# (WinForms) 中拦截应用程序中所有控件的单击事件
【发布时间】:2011-05-15 20:24:01
【问题描述】:

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

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

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

提前致谢!

【问题讨论】:

    标签: c# .net winforms events interception


    【解决方案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界面上的帮助。

          【讨论】:

            猜你喜欢
            • 2013-07-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-03
            • 2012-03-12
            • 2012-02-11
            • 1970-01-01
            相关资源
            最近更新 更多