【问题标题】:How do I detect control entering/leaving on a per-application basis, without access to the control's form?如何在不访问控件表单的情况下检测每个应用程序的控件进入/离开?
【发布时间】:2009-02-22 11:51:50
【问题描述】:

我可以使用 Control.Enter 和 Control.Leave 事件来检测用户焦点何时进入或离开控件,但这仅适用于每个表单。我在我的应用程序中使用了多个表单,并且想要跟踪哪个控件具有用户焦点,我必须使用表单的 Activated 和 Deactivated 事件来跟踪哪个表单处于活动状态,然后跟踪哪个控件在每个表单中聚焦。

我们正在使用 DockPanel 套件构建客户端,因此我们无法直接访问控件的表单。我们不能只将侦听器添加到控件的顶级表单,因为当用户停靠或取消停靠面板时,它会发生变化。但是我们仍然需要在每个应用程序的基础上跟踪焦点。如何在不访问控件表单的情况下检测每个应用程序的控件进入/离开?

【问题讨论】:

    标签: c# .net winforms focus


    【解决方案1】:

    您能否改为挂钩到 Control.GotFocus/Control.LostFocus,然后全局跟踪当前具有焦点的控件?

    将这些事件挂钩添加到每个控件将非常乏味且容易出错,因为您可能会错过感兴趣的控件。因此,不如使用Application.AddMessageFilter 调用来获取应用程序中出现的每个 Windows 消息的回调。

    然后您可以查看所有WM___SETFOCUSWM_KILLFOCUS 调用并记录当前控件的焦点。请记住使用方便的 Control.FromHandle 静态方法从跟踪两个窗口消息时缓存的窗口句柄中获取一个不错的 .NET 控件引用。

    【讨论】:

    【解决方案2】:

    也许可以查看 Unity 应用程序块和控制反转 (IOC) 容器依赖注入?

    http://codebetter.com/blogs/david.hayden/archive/2008/02/22/unity-ioc-screencast.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多