知道谁在迷失焦点事件中获得了焦点

是否有可能知道谁在焦点事件中失去了焦点?

Compact Framework没有ActiveControl ,所以我不知道如何判断谁得到了关注。

这是最终工作的解决方案:

 public System.Windows.Forms.Control FindFocusedControl() { return FindFocusedControl(this); } public static System.Windows.Forms.Control FindFocusedControl(System.Windows.Forms.Control container) { foreach (System.Windows.Forms.Control childControl in container.Controls) { if (childControl.Focused) { return childControl; } } foreach (System.Windows.Forms.Control childControl in container.Controls) { System.Windows.Forms.Control maybeFocusedControl = FindFocusedControl(childControl); if (maybeFocusedControl != null) { return maybeFocusedControl; } } return null; // Couldn't find any, darn! } 

一种选择是互换GetFocus API

 [DllImport("coredll.dll, EntryPoint="GetFocus")] public extern static IntPtr GetFocus(); 

这将为您提供当前具有输入焦点的窗口的句柄,然后您可以递归迭代控制树以查找具有该句柄的控件。

使用corell.dll看起来是个好主意。

另一种可能的方法是为表单上的所有控件创建GotFocus事件处理程序然后创建一个类级别变量,该变量使用具有当前焦点的控件的名称进行更新。

首先是一个控件的LostFocus事件然后是下一个控件的GotFocus事件。 只要您无法确定用户在下一刻使用哪种控件,就无法做到。
而如果紧凑框架控件确实具有TabIndex属性,则只有在用户使用tab键时才能预测它。

编辑:好的你发布了解决方案,它工作正常我必须承认:简单的“否”是错误的+1

这是使用Linq的Vaccano答案的较短代码

 private static Control FindFocusedControl(Control container) { foreach (Control childControl in container.Controls.Cast().Where(childControl => childControl.Focused)) return childControl; return (from Control childControl in container.Controls select FindFocusedControl(childControl)).FirstOrDefault(maybeFocusedControl => maybeFocusedControl != null); } 

完全相同(在高级,抽象)。