public Window(Process p) { this.p = p; IntPtr h = p.Handle; while (h == IntPtr.Zero || !p.Responding) { Sleep(1000); p.WaitForInputIdle(); h = p.Handle; if (p.HasExited) { throw new InvalidOperationException(string.Format("Process '{0}' has exited!", p.StartInfo.FileName)); } } p.Exited += new EventHandler(OnExited); int id = p.Id; if (handle == IntPtr.Zero) { // p.MainWindowHandle always returns 0 for some unknown reason... int retries = 20; while (retries-- > 0 && handle == IntPtr.Zero) { handle = FindWindowForProcessId(id); Sleep(1000); } if (handle == IntPtr.Zero) { throw new Exception("Process as no window handle"); } } this.acc = SystemAccessible.AccessibleObjectForWindow(handle); }
void LoadSimpleChildren(SystemAccessible item) { for (int i = 1, n = item.GetChildCount(); i <= n; i++) { SystemAccessible child = (SystemAccessible)item.GetChild(i); AddChild(child); } }
void LoadComplexChildren(SystemAccessible item) { SystemAccessible first = item.FirstChild; if (first != null) { SystemAccessible last = item.LastChild; SystemAccessible child = first; while (child != null) { AddChild(child); if (child == last) break; child = child.NextSibling; } } }
void LoadChildren(SystemAccessible item) { switch (item.Role) { case AccessibleRole.Alert: break; case AccessibleRole.Animation: break; case AccessibleRole.Application: break; case AccessibleRole.Border: break; case AccessibleRole.ButtonDropDown: break; case AccessibleRole.ButtonDropDownGrid: break; case AccessibleRole.ButtonMenu: break; case AccessibleRole.Caret: break; case AccessibleRole.Cell: break; case AccessibleRole.Character: break; case AccessibleRole.Chart: break; case AccessibleRole.CheckButton: break; case AccessibleRole.Client: case AccessibleRole.Window: this.LoadComplexChildren(item); break; case AccessibleRole.Clock: break; case AccessibleRole.Column: break; case AccessibleRole.ColumnHeader: break; case AccessibleRole.ComboBox: break; case AccessibleRole.Cursor: break; case AccessibleRole.Default: break; case AccessibleRole.Diagram: break; case AccessibleRole.Dial: break; case AccessibleRole.Dialog: break; case AccessibleRole.Document: break; case AccessibleRole.DropList: break; case AccessibleRole.Equation: break; case AccessibleRole.Graphic: break; case AccessibleRole.Grip: break; case AccessibleRole.Grouping: break; case AccessibleRole.HelpBalloon: break; case AccessibleRole.HotkeyField: break; case AccessibleRole.Indicator: break; case AccessibleRole.IpAddress: break; case AccessibleRole.Link: break; case AccessibleRole.List: break; case AccessibleRole.ListItem: break; case AccessibleRole.MenuBar: case AccessibleRole.MenuItem: case AccessibleRole.MenuPopup: case AccessibleRole.ToolBar: this.LoadSimpleChildren(item); break; case AccessibleRole.None: break; case AccessibleRole.Outline: break; case AccessibleRole.OutlineButton: break; case AccessibleRole.OutlineItem: break; case AccessibleRole.PageTab: break; case AccessibleRole.PageTabList: break; case AccessibleRole.Pane: break; case AccessibleRole.ProgressBar: break; case AccessibleRole.PropertyPage: break; case AccessibleRole.PushButton: break; case AccessibleRole.RadioButton: break; case AccessibleRole.Row: break; case AccessibleRole.RowHeader: break; case AccessibleRole.ScrollBar: break; case AccessibleRole.Separator: break; case AccessibleRole.Slider: break; case AccessibleRole.Sound: break; case AccessibleRole.SpinButton: break; case AccessibleRole.SplitButton: break; case AccessibleRole.StaticText: break; case AccessibleRole.StatusBar: break; case AccessibleRole.Table: break; case AccessibleRole.Text: break; case AccessibleRole.TitleBar: break; case AccessibleRole.ToolTip: break; case AccessibleRole.WhiteSpace: break; default: break; } }
void AddChild(SystemAccessible child) { string name = child.Name; if (!string.IsNullOrEmpty(name) && child.Role != AccessibleRole.Window) { Trace.WriteLine("Found: " + name); if (!map.ContainsKey(name) || child.Role == AccessibleRole.Client) { map[name] = child; } else { Trace.WriteLine(string.Format("Ambiguous item name: '{0}'", name)); } } if (child.GetChildCount() > 0) { LoadChildren(child); } }
public Window(Window parent, IntPtr handle) { this.parent = parent; this.handle = handle; this.acc = SystemAccessible.AccessibleObjectForWindow(handle); }