知道谁在迷失焦点事件中获得了焦点
是否有可能知道谁在焦点事件中失去了焦点?
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); }
完全相同(在高级,抽象)。