如何检测进入/离开每个应用程序的控制权,而无需访问控制表单?


1

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

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

0

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

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


1

你能钩到Control.GotFocus/Control.LostFocus代替,然后保持全球跟踪哪些控制当前具有焦点?

将这些事件挂钩添加到每个控件将是非常单调和容易出错,因为您可能会错过一个感兴趣的控件。所以,而不是如何使用Application.AddMessageFilter调用,以获得应用程序中发生的每个Windows消息的回调。

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

  0

不幸的是,WM_SETFOCUS消息并不总是通过消息队列,所以我不能拦截它。见http://www.pcreview.co.uk/forums/thread-1314811.php 23 2月. 092009-02-23 10:32:18