/// <summary> /// Walks the UI Automation tree and adds the control type of each element it finds /// in the control view to a TreeView. /// </summary> /// <param name="rootElement">The root of the search on this iteration.</param> /// <param name="treeNode">The node in the TreeView for this iteration.</param> /// <remarks> /// This is a recursive function that maps out the structure of the subtree beginning at the /// UI Automation element passed in as rootElement on the first call. This could be, for example, /// an application window. /// CAUTION: Do not pass in AutomationElement.RootElement. Attempting to map out the entire subtree of /// the desktop could take a very long time and even lead to a stack overflow. /// </remarks> private void WalkControlElements(AutomationElement rootElement, Tree_List <AutomationElement> treeNode) { // Conditions for the basic views of the subtree (content, control, and raw) // are available as fields of TreeWalker, and one of these is used in the // following code. AutomationElement elementNode = TreeWalker.ContentViewWalker.GetFirstChild(rootElement); while (elementNode != null) { // if (elementNode.Current.ClassName == "AfxWnd80u") // { // try // { // elementNode.SetFocus(); // Feedback.print("*okay*"); // } // catch // { // } ////Control control = Control.FromHandle((IntPtr)elementNode.Current.NativeWindowHandle); ////control.Select(); // // SilentOrb.Utility.Windows.set_foreground_window((IntPtr)elementNode.Current.NativeWindowHandle); // } Tree_List <AutomationElement> childTreeNode = treeNode.add(elementNode); WalkControlElements(elementNode, childTreeNode); elementNode = TreeWalker.ContentViewWalker.GetNextSibling(elementNode); } }