/// <summary> /// Retreives message from popup /// </summary> /// <param name="paccParent">Parent window as IAccessible</param> /// <param name="childId">Id of child</param> /// <returns>The popup title and message</returns> public static PopupMessage GetPopupWindowMessage(IAccessible paccParent, int childId) { PopupMessage windowDescription = new PopupMessage(); windowDescription.TitleBar = GetUIElementName(paccParent, childId); GetPopupWindowMessageHelper(paccParent, ref windowDescription); return(windowDescription); }
/// <summary> /// Utility function to get the popup message /// </summary> /// <param name="paccParent">Parent window as IAccessible</param> /// <param name="windowDescription">reference to popup message record</param> public static void GetPopupWindowMessageHelper(IAccessible paccParent, ref PopupMessage windowDescription) { int numChildren = paccParent.accChildCount; object[] children = new object[numChildren]; NativeMethods.AccessibleChildren(paccParent, 0, numChildren, children, out numChildren); uint roleIdRef = 0; foreach (object child in children) { if (child is IAccessible) { IAccessible accessibleChild = (IAccessible)child; if (GetUIElementRole(accessibleChild, NativeMethods.CHILDID_SELF, ref roleIdRef) == "text") { windowDescription.MessageText += GetUIElementName(accessibleChild, NativeMethods.CHILDID_SELF); } GetPopupWindowMessageHelper(accessibleChild, ref windowDescription); } } }
/// <summary> /// Compares current window to configured windows /// </summary> /// <param name="hwndPtr">Handle to window</param> /// <param name="pacc">Accessible representation of window</param> /// <param name="windowDescription">title and message of window</param> /// <param name="windowClass">window class</param> private void CompareToConfiguredWindows(IntPtr hwndPtr, IAccessible pacc, PopupMessage windowDescription, string windowClass) { IEnumerator children; PopupBasherConfiguration.PopupConfigChild currentChildWindow; IAccessible accControl = null; int childId; // Normal popup bashing behavior if (PopupBasherConfiguration.Instance.Windows != null && PopupBasherConfiguration.Instance.Windows.Windows != null) { // For each configured windows, search the couple windows name / class foreach (PopupBasherConfiguration.PopupConfigWindow currentWindow in PopupBasherConfiguration.Instance.Windows.Windows) { if (windowDescription.TitleBar == currentWindow.Title && windowClass == currentWindow.ClassName) { // The parent window has been found, so act on children Tracing.WriteDebugTextInfo(Tracing.ComponentId.ExcelDriver, Resources.PopupBasher_FoundParent, currentWindow.Title, currentWindow.ClassName); NativeMethods.ShowWindow(hwndPtr, ShowWindowMode.SW_NORMAL); NativeMethods.SetFocus(hwndPtr); // Iterate thru children (form elements) children = currentWindow.Children.GetEnumerator(); while (children.MoveNext()) { currentChildWindow = (PopupBasherConfiguration.PopupConfigChild)children.Current; Tracing.WriteDebugTextVerbose( Tracing.ComponentId.ExcelDriver, Resources.PopupBasher_SearchingForChild, currentChildWindow.Title, currentChildWindow.ClassName, currentChildWindow.Role); if (AccessibleHelper.FindChild(pacc, NativeMethods.CHILDID_SELF, currentChildWindow, out accControl, out childId)) { // Add popup to list of bashed popups this.bashedPopups.Add(windowDescription); Tracing.WriteDebugTextVerbose( Tracing.ComponentId.ExcelDriver, Resources.PopupBasher_FoundChild, currentChildWindow.Title, currentChildWindow.ClassName, currentChildWindow.Role, windowDescription.MessageText); if (currentChildWindow.Action == PopupBasherConfiguration.ActionType.DoDefault) { // Perform the default action LogDefaultAction( currentWindow.Title, currentWindow.ClassName, currentChildWindow.Title, currentChildWindow.ClassName, currentChildWindow.Role); accControl.accDoDefaultAction(childId); break; } } } // while (children.MoveNext()) } // if } // foreach popup window } // if windows != null }