示例#1
0
        public WindowsSelector(AutomationElement element, WindowsSelector anchor, bool doEnum)
        {
            var sw = new System.Diagnostics.Stopwatch();

            sw.Start();
            Log.Selector(string.Format("windowsselector::begin {0:mm\\:ss\\.fff}", sw.Elapsed));

            AutomationElement root        = null;
            AutomationElement baseElement = null;
            var pathToRoot = new List <AutomationElement>();

            while (element != null)
            {
                // Break on circular relationship (should not happen?)
                //if (pathToRoot.Contains(element) || element.Equals(_rootElement)) { break; }
                // if (pathToRoot.Contains(element)) { break; }
                try
                {
                    if (element.Parent != null)
                    {
                        pathToRoot.Add(element);
                    }
                    if (element.Parent == null)
                    {
                        root = element;
                    }
                }
                catch (Exception)
                {
                    root = element;
                }
                try
                {
                    //element = _treeWalker.GetParent(element);
                    element = element.Parent;
                }
                catch (Exception ex)
                {
                    Log.Error(ex, "");
                    return;
                }
            }
            Log.Selector(string.Format("windowsselector::create pathToRoot::end {0:mm\\:ss\\.fff}", sw.Elapsed));
            pathToRoot.Reverse();
            if (anchor != null)
            {
                //var anchorlist = anchor.Where(x => x.Enabled && x.Selector == null).ToList();
                //for (var i = 0; i < anchorlist.Count(); i++)
                //{
                //    if(WindowsSelectorItem.Match(anchorlist[i], pathToRoot[0]))
                //    //if (((WindowsSelectorItem)anchorlist[i]).Match(pathToRoot[0]))
                //    {
                //        pathToRoot.Remove(pathToRoot[0]);
                //    }
                //    else
                //    {
                //        Log.Selector("Element does not match the anchor path");
                //        return;
                //    }
                //}
                var a   = anchor.Last();
                var idx = -1;
                for (var i = 0; i < pathToRoot.Count(); i++)
                {
                    if (WindowsSelectorItem.Match(a, pathToRoot[i]))
                    {
                        idx = i;
                        break;
                    }
                }
                pathToRoot.RemoveRange(0, idx);
            }
            WindowsSelectorItem item;

            if (PluginConfig.traverse_selector_both_ways)
            {
                Log.Selector(string.Format("windowsselector::create traverse_selector_both_ways::begin {0:mm\\:ss\\.fff}", sw.Elapsed));
                var temppathToRoot = new List <AutomationElement>();
                var newpathToRoot  = new List <AutomationElement>();
                foreach (var e in pathToRoot)
                {
                    temppathToRoot.Add(e);
                }
                Log.Selector(string.Format("windowsselector::traverse back to element from root::begin {0:mm\\:ss\\.fff}", sw.Elapsed));
                using (var automation = AutomationUtil.getAutomation())
                {
                    bool isDesktop           = true;
                    AutomationElement parent = null;
                    if (anchor != null)
                    {
                        parent = temppathToRoot[0].Parent; isDesktop = false;
                    }
                    else
                    {
                        automation.GetDesktop();
                    }
                    int count = temppathToRoot.Count;
                    while (temppathToRoot.Count > 0)
                    {
                        count--;
                        var i = temppathToRoot.First();
                        temppathToRoot.Remove(i);
                        item = new WindowsSelectorItem(i, false);
                        var m = item.matches(root, count, parent, 2, isDesktop, false);
                        if (m.Length > 0)
                        {
                            newpathToRoot.Add(i);
                            parent    = i;
                            isDesktop = false;
                        }
                        if (m.Length == 0 && Config.local.log_selector)
                        {
                            //var message = "needed to find " + Environment.NewLine + item.ToString() + Environment.NewLine + "but found only: " + Environment.NewLine;
                            //var children = parent.FindAllChildren();
                            //foreach (var c in children)
                            //{
                            //    try
                            //    {
                            //        message += new UIElement(c).ToString() + Environment.NewLine;
                            //    }
                            //    catch (Exception)
                            //    {
                            //    }
                            //}
                            //Log.Debug(message);
                        }
                    }
                }
                if (newpathToRoot.Count != pathToRoot.Count)
                {
                    Log.Information("Selector had " + pathToRoot.Count + " items to root, but traversing children only matched " + newpathToRoot.Count);
                    pathToRoot = newpathToRoot;
                }
                Log.Selector(string.Format("windowsselector::create traverse_selector_both_ways::end {0:mm\\:ss\\.fff}", sw.Elapsed));
            }
            if (pathToRoot.Count == 0)
            {
                Log.Error("Element has not parent, or is same as annchor");
                return;
            }
            baseElement = pathToRoot.First();
            element     = pathToRoot.Last();
            Clear();
            Log.Selector(string.Format("windowsselector::remove anchor if needed::end {0:mm\\:ss\\.fff}", sw.Elapsed));
            if (anchor == null)
            {
                Log.Selector(string.Format("windowsselector::create root element::begin {0:mm\\:ss\\.fff}", sw.Elapsed));
                item         = new WindowsSelectorItem(baseElement, true);
                item.Enabled = true;
                //item.canDisable = false;
                Items.Add(item);
                Log.Selector(string.Format("windowsselector::create root element::end {0:mm\\:ss\\.fff}", sw.Elapsed));
            }

            if (PluginConfig.search_descendants)
            {
                Log.Selector(string.Format("windowsselector::search_descendants::begin {0:mm\\:ss\\.fff}", sw.Elapsed));
                if (anchor == null)
                {
                    // Add window, we NEED to search from a window
                    item = new WindowsSelectorItem(pathToRoot[0], false, -1);
                    if (doEnum)
                    {
                        item.EnumNeededProperties(pathToRoot[pathToRoot.Count - 1], pathToRoot[pathToRoot.Count - 1].Parent);
                    }
                    item.canDisable = false;
                    Items.Add(item);


                    var FrameworkId = item.Properties.Where(x => x.Name == "FrameworkId").FirstOrDefault();
                    if (FrameworkId != null && (FrameworkId.Value == "XAML" || FrameworkId.Value == "WinForm"))
                    {
                        var itemname = item.Properties.Where(x => x.Name == "Name").FirstOrDefault();
                        if (itemname != null)
                        {
                            itemname.Enabled = false;
                        }
                    }
                }
                if (pathToRoot.Count > 2)
                {
                    item = new WindowsSelectorItem(pathToRoot[pathToRoot.Count - 2], false, -1);
                    if (doEnum)
                    {
                        item.EnumNeededProperties(pathToRoot[pathToRoot.Count - 2], pathToRoot[pathToRoot.Count - 2].Parent);
                    }
                    Items.Add(item);
                }
                if (pathToRoot.Count > 1)
                {
                    int IndexInParent = -1;
                    if (pathToRoot[pathToRoot.Count - 1].Parent != null)
                    {
                        var c = pathToRoot[pathToRoot.Count - 1].Parent.FindAllChildren();
                        for (var x = 0; x < c.Count(); x++)
                        {
                            if (pathToRoot[pathToRoot.Count - 1].Equals(c[x]))
                            {
                                IndexInParent = x;
                            }
                        }
                    }
                    item = new WindowsSelectorItem(pathToRoot[pathToRoot.Count - 1], false, IndexInParent);
                    if (doEnum)
                    {
                        item.EnumNeededProperties(pathToRoot[pathToRoot.Count - 1], pathToRoot[pathToRoot.Count - 1].Parent);
                    }
                    Items.Add(item);
                }
                Log.Selector(string.Format("windowsselector::search_descendants::end {0:mm\\:ss\\.fff}", sw.Elapsed));
            }
            else
            {
                bool isStartmenu = false;
                for (var i = 0; i < pathToRoot.Count(); i++)
                {
                    Log.Selector(string.Format("windowsselector::search_descendants::loop element " + i + ":begin {0:mm\\:ss\\.fff}", sw.Elapsed));
                    var o             = pathToRoot[i];
                    int IndexInParent = -1;
                    if (o.Parent != null && i > 0)
                    {
                        var c = o.Parent.FindAllChildren();
                        for (var x = 0; x < c.Count(); x++)
                        {
                            if (o.Equals(c[x]))
                            {
                                IndexInParent = x;
                            }
                        }
                    }

                    item = new WindowsSelectorItem(o, false, IndexInParent);
                    var _IndexInParent = item.Properties.Where(x => x.Name == "IndexInParent").FirstOrDefault();
                    if (_IndexInParent != null)
                    {
                        _IndexInParent.Enabled = false;
                    }
                    if (i == 0 || i == (pathToRoot.Count() - 1))
                    {
                        item.canDisable = false;
                    }
                    foreach (var p in item.Properties)
                    {
                        int idx = p.Value.IndexOf(".");
                        if (p.Name == "ClassName" && idx > -1)
                        {
                            var FrameworkId = item.Properties.Where(x => x.Name == "FrameworkId").FirstOrDefault();
                            //if (FrameworkId!=null && (FrameworkId.Value == "XAML" || FrameworkId.Value == "WinForm") && _IndexInParent != null)
                            //{
                            //    item.Properties.ForEach(x => x.Enabled = false);
                            //    _IndexInParent.Enabled = true;
                            //    p.Enabled = true;
                            //}
                            int idx2 = p.Value.IndexOf(".", idx + 1);
                            // if (idx2 > idx) p.Value = p.Value.Substring(0, idx2 + 1) + "*";
                            if (idx2 > idx && item.Properties.Count > 1)
                            {
                                p.Enabled = false;
                            }
                        }
                        //if (p.Name == "ClassName" && p.Value.StartsWith("WindowsForms10")) p.Value = "WindowsForms10*";
                        if (p.Name == "ClassName" && p.Value.ToLower() == "shelldll_defview")
                        {
                            item.Enabled = false;
                        }
                        if (p.Name == "ClassName" && (p.Value.ToLower() == "dv2vontrolhost" || p.Value.ToLower() == "desktopprogramsmfu"))
                        {
                            isStartmenu = true;
                        }
                        //if (p.Name == "ClassName" && p.Value == "#32770")
                        //{
                        //    item.Enabled = false;
                        //}
                        if (p.Name == "ControlType" && p.Value == "ListItem" && isStartmenu)
                        {
                            p.Enabled = false;
                        }
                    }
                    var hassyslistview32 = item.Properties.Where(p => p.Name == "ClassName" && p.Value.ToLower() == "syslistview32").ToList();
                    if (hassyslistview32.Count > 0)
                    {
                        var hasControlType = item.Properties.Where(p => p.Name == "ControlType").ToList();
                        if (hasControlType.Count > 0)
                        {
                            hasControlType[0].Enabled = false;
                        }
                    }

                    if (doEnum)
                    {
                        item.EnumNeededProperties(o, o.Parent);
                    }
                    Items.Add(item);
                    Log.Selector(string.Format("windowsselector::search_descendants::loop element " + i + ":end {0:mm\\:ss\\.fff}", sw.Elapsed));
                }
            }
            pathToRoot.Reverse();
            if (anchor != null)
            {
                var p = Items[0].Properties.Where(x => x.Name == "SearchDescendants").FirstOrDefault();
                if (p == null)
                {
                    Items[0].Properties.Add(new SelectorItemProperty("SearchDescendants", PluginConfig.search_descendants.ToString()));
                }
            }
            Log.Selector(string.Format("windowsselector::end {0:mm\\:ss\\.fff}", sw.Elapsed));
            OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("Count"));
            OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("Item[]"));
            OnCollectionChanged(new System.Collections.Specialized.NotifyCollectionChangedEventArgs(System.Collections.Specialized.NotifyCollectionChangedAction.Reset));
        }
示例#2
0
 public bool Match(SelectorItem item, IElement m)
 {
     return(WindowsSelectorItem.Match(item, m.RawElement as AutomationElement));
 }
示例#3
0
        public static UIElement[] GetElementsWithuiSelectorItem(int ident, AutomationBase automation, WindowsSelectorItem sel, UIElement[] parents, int maxresults, bool LastItem, bool search_descendants)
        {
            var _current = new List <UIElement>();
            var cond     = sel.GetConditionsWithoutStar();

            foreach (var _ele in parents)
            {
                if (PluginConfig.enable_cache && cond.ChildCount > 0)
                {
                    var cache = WindowsSelectorItem.GetFromCache(_ele.RawElement, ident, cond.ToString());
                    if (cache != null)
                    {
                        Log.Debug("GetElementsWithuiSelector: found in AppWindowCache " + cond.ToString());
                        foreach (var elementNode in cache)
                        {
                            if (WindowsSelectorItem.Match(sel, elementNode))
                            {
                                _current.Add(new UIElement(elementNode));
                            }
                        }
                    }
                }
                if (!string.IsNullOrEmpty(sel.processname()))
                {
                    if (!string.IsNullOrEmpty(sel.processname()) && (sel.processname().ToLower() != "startmenuexperiencehost" && sel.processname().ToLower() != "explorer"))
                    {
                        var me = System.Diagnostics.Process.GetCurrentProcess();
                        var ps = System.Diagnostics.Process.GetProcessesByName(sel.processname()).Where(_p => _p.SessionId == me.SessionId).ToArray();
                        if (ps.Length == 0)
                        {
                            Log.Selector(string.Format("GetElementsWithuiSelector::Process " + sel.processname() + " not found, end with 0 results"));
                            return(new UIElement[] { });
                        }
                        var psids = ps.Select(x => x.Id).ToArray();

                        var condition = new FlaUI.Core.Conditions.ConditionFactory(automation.PropertyLibrary);
                        var ors       = new List <FlaUI.Core.Conditions.ConditionBase>();
                        foreach (var p in ps)
                        {
                            ors.Add(condition.ByProcessId(p.Id));
                        }
                        var con = new FlaUI.Core.Conditions.OrCondition(ors);
                        if (PluginConfig.enable_cache && con.ChildCount > 0)
                        {
                            var cache = WindowsSelectorItem.GetFromCache(_ele.RawElement, ident, con.ToString());
                            if (cache != null)
                            {
                                Log.Debug("GetElementsWithuiSelector: found in AppWindowCache " + con.ToString());
                                foreach (var elementNode in cache)
                                {
                                    if (WindowsSelectorItem.Match(sel, elementNode))
                                    {
                                        _current.Add(new UIElement(elementNode));
                                    }
                                }
                            }
                        }

                        if (_current.Count == 0)
                        {
                            Log.Debug(string.Format("GetElementsWithuiSelector::Searchin for all " + con.ToString()));
                            // var ___treeWalker = automation.TreeWalkerFactory.GetCustomTreeWalker(con);
                            var ___treeWalker     = automation.TreeWalkerFactory.GetControlViewWalker();
                            int retries           = 0;
                            AutomationElement win = null;
                            bool hasError         = false;
                            do
                            {
                                hasError = false;
                                try
                                {
                                    win = ___treeWalker.GetFirstChild(_ele.RawElement);
                                }
                                catch (Exception ex)
                                {
                                    Log.Debug(ex.ToString());
                                    retries++;
                                    hasError = true;
                                    // throw;
                                }
                            } while (hasError && retries < 10);

                            while (win != null)
                            {
                                bool addit = false;
                                if (win.Properties.ProcessId.IsSupported && psids.Contains(win.Properties.ProcessId))
                                {
                                    addit = true;
                                }
                                if (addit)
                                {
                                    var uiele = new UIElement(win);
                                    Log.Debug(string.Format("GetElementsWithuiSelector::Adding element " + uiele.ToString()));
                                    _current.Add(uiele);
                                    if (win.Patterns.Window.TryGetPattern(out var winPattern))
                                    {
                                        if (winPattern.WindowVisualState.Value == FlaUI.Core.Definitions.WindowVisualState.Minimized)
                                        {
                                            IntPtr handle = win.Properties.NativeWindowHandle.Value;
                                            winPattern.SetWindowVisualState(FlaUI.Core.Definitions.WindowVisualState.Normal);
                                        }
                                    }
                                    if (PluginConfig.allow_multiple_hits_mid_selector || ident == 0) // do all
                                    {
                                        win = ___treeWalker.GetNextSibling(win);
                                    }
                                    else
                                    {
                                        win = null;
                                    }
                                }
                                else
                                {
                                    win = ___treeWalker.GetNextSibling(win);
                                }
                            }
                            if (_current.Count > 0 && PluginConfig.enable_cache && con.ChildCount > 0)
                            {
                                var elements = _current.Select(x => x.RawElement).ToArray();
                                WindowsSelectorItem.AddToCache(_ele.RawElement, ident, con.ToString(), elements);
                            }
                        }
                    }
                    return(_current.ToArray());
                }
                if (_current.Count == 0 && string.IsNullOrEmpty(sel.Selector))
                {
                    Log.Debug("GetElementsWithuiSelector::Searchin for " + cond.ToString());
                    ITreeWalker _treeWalker = default(ITreeWalker);
                    if (sel.search_descendants || search_descendants)
                    {
                        var hasStar = sel.Properties.Where(x => x.Enabled == true && (x.Value != null && x.Value.Contains("*"))).ToArray();
                        _treeWalker = automation.TreeWalkerFactory.GetCustomTreeWalker(cond);
                    }
                    else
                    {
                        _treeWalker = automation.TreeWalkerFactory.GetControlViewWalker();
                    }
                    int retries           = 0;
                    AutomationElement ele = null;
                    bool hasError         = false;
                    do
                    {
                        hasError = false;
                        try
                        {
                            ele = _treeWalker.GetFirstChild(_ele.RawElement);
                        }
                        catch (Exception ex)
                        {
                            Log.Debug(ex.ToString());
                            retries++;
                            hasError = true;
                            // throw;
                        }
                    } while (hasError && retries < 10);


                    if (ele != null)
                    {
                        do
                        {
                            // Log.Debug(string.Format("GetElementsWithuiSelector::Match element {0:mm\\:ss\\.fff}", sw.Elapsed));
                            if (WindowsSelectorItem.Match(sel, ele))
                            {
                                var uiele = new UIElement(ele);
                                Log.Debug(string.Format("GetElementsWithuiSelector::Adding element " + uiele.ToString()));
                                _current.Add(uiele);
                            }

                            bool getmore = false;
                            if (LastItem)
                            {
                                if (_current.Count < maxresults)
                                {
                                    getmore = true;
                                }
                            }
                            else
                            {
                                if (_current.Count == 0)
                                {
                                    getmore = true;
                                }
                                else if (PluginConfig.allow_multiple_hits_mid_selector)
                                {
                                    getmore = true;
                                }
                            }
                            if (getmore)
                            {
                                ele = _treeWalker.GetNextSibling(ele);
                            }
                            if (!getmore)
                            {
                                ele = null;
                            }
                        } while (ele != null);
                    }
                    if (_current.Count > 0 && PluginConfig.enable_cache && cond.ChildCount > 0)
                    {
                        var elements = _current.Select(x => x.RawElement).ToArray();
                        WindowsSelectorItem.AddToCache(_ele.RawElement, ident, cond.ToString(), elements);
                    }
                }
            }
            return(_current.ToArray());
        }
示例#4
0
        public static UIElement[] GetElementsWithuiSelector(WindowsSelector selector, IElement fromElement, int maxresults, WindowsCacheExtension ext)
        {
            TimeSpan timeout = TimeSpan.FromMilliseconds(5000);

            timeout = TimeSpan.FromMilliseconds(20000);
            var sw = new System.Diagnostics.Stopwatch();

            sw.Start();
            Log.Selector(string.Format("GetElementsWithuiSelector::begin {0:mm\\:ss\\.fff}", sw.Elapsed));

            UIElement _fromElement = fromElement as UIElement;
            // var selectors = selector.Where(x => x.Enabled == true && x.Selector == null).ToList();
            var selectors = selector.ToList();
            AutomationElement startfrom = null;

            if (_fromElement != null)
            {
                startfrom = _fromElement.RawElement;
            }


            var _current = new List <UIElement>();
            // var automation = AutomationUtil.getAutomation();
            AutomationBase automation = null;

            if (ext != null)
            {
                automation = ext.automation;
            }
            if (automation == null)
            {
                automation = AutomationUtil.getAutomation();
            }

            UIElement[] result = null;
            // AutomationElement ele = null;

            bool search_descendants = PluginConfig.search_descendants;
            var  v = selectors[0].Properties.Where(x => x.Name == "search_descendants").FirstOrDefault();

            if (v == null)
            {
                selectors[0].Properties.Where(x => x.Name == "SearchDescendants").FirstOrDefault();
            }
            if (v != null)
            {
                search_descendants = bool.Parse(v.Value);
            }

            if (startfrom == null)
            {
                startfrom = automation.GetDesktop();
            }
            _current.Add(new UIElement(startfrom));
            for (var i = 0; i < selectors.Count; i++)
            {
                var _sel    = selectors[i];
                var sel     = new WindowsSelectorItem(_sel);
                var current = _current.ToArray();
                _current.Clear();
                // if(i == 1 && current.Length == 1 && current.First().ControlType == sel.ControlType)
                if (i == 1)
                {
                    foreach (var e in current)
                    {
                        if (WindowsSelectorItem.Match(sel, e.RawElement))
                        {
                            _current.Add(e);
                        }
                    }
                    if (_current.Count > 0)
                    {
                        continue;
                    }
                    //_current = GetElementsWithuiSelectorItem(automation, sel, current, maxresults, i == (selectors.Count - 1)).ToList();
                    //if(_current.Count == 0) _current = current.ToList();
                    //_current = current.ToList();
                }
                _current = GetElementsWithuiSelectorItem(i, automation, sel, current, maxresults, i == (selectors.Count - 1), search_descendants).ToList();
                if (i == 0 && _current.Count == 0)
                {
                    _current = current.ToList();
                }
            }
            Log.Debug(string.Format("GetElementsWithuiSelector::completed with " + _current.Count + " results {0:mm\\:ss\\.fff}", sw.Elapsed));
            if (_current.Count > 0)
            {
                result = _current.ToArray();
                if (result.Count() > maxresults)
                {
                    Console.WriteLine("found " + result.Count() + " but only needed " + maxresults);
                    result = result.Take(maxresults).ToArray();
                }
                return(result);
            }
            if (result == null)
            {
                Log.Selector(string.Format("GetElementsWithuiSelector::ended with 0 results after {0:mm\\:ss\\.fff}", sw.Elapsed));
                return(new UIElement[] { });
            }
            if (result.Count() > maxresults)
            {
                result = result.Take(maxresults).ToArray();
            }
            Log.Selector(string.Format("GetElementsWithuiSelector::ended with " + result.Length + " results after {0:mm\\:ss\\.fff}", sw.Elapsed));
            return(result);
        }
 public void DetectorCheck(AutomationElement element, FlaUI.Core.Definitions.StructureChangeType e, int[] arg3)
 {
     try
     {
         if (Entity == null || string.IsNullOrEmpty(Selector))
         {
             return;
         }
         TimeSpan timepassed = DateTime.Now - lastTriggered;
         if (timepassed.Milliseconds < 100)
         {
             return;
         }
         lastTriggered = DateTime.Now;
         // if (e != FlaUI.Core.Definitions.StructureChangeType.ChildAdded) return;
         var pathToRoot = new List <AutomationElement>();
         while (element != null)
         {
             if (pathToRoot.Contains(element))
             {
                 break;
             }
             try
             {
                 if (element.Parent != null)
                 {
                     pathToRoot.Add(element);
                 }
             }
             catch (Exception)
             {
             }
             try
             {
                 element = element.Parent;
             }
             catch (Exception ex)
             {
                 Log.Error(ex, "");
                 return;
             }
         }
         WindowsSelector selector = new WindowsSelector(Selector);
         if (pathToRoot.Count < (selector.Count - 1))
         {
             return;
         }
         if (pathToRoot.Count > (selector.Count - 1))
         {
             return;
         }
         pathToRoot.Reverse();
         for (var i = 0; i < pathToRoot.Count; i++)
         {
             element = pathToRoot[i];
             if (selector.Count > (i + 1))
             {
                 WindowsSelectorItem s = new WindowsSelectorItem(selector[(i + 1)]);
                 if (!s.Match(element))
                 {
                     return;
                 }
             }
             else
             {
                 return;
             }
         }
         var _e = new DetectorEvent(new UIElement(element));
         OnDetector?.Invoke(this, _e, EventArgs.Empty);
     }
     catch (Exception ex)
     {
         Log.Error(ex.ToString());
     }
 }
示例#6
0
        public WindowsSelector(AutomationElement element, WindowsSelector anchor, bool doEnum)
        {
            var sw = new System.Diagnostics.Stopwatch();

            sw.Start();
            Log.Selector(string.Format("windowsselector::begin {0:mm\\:ss\\.fff}", sw.Elapsed));

            AutomationElement root        = null;
            AutomationElement baseElement = null;
            var pathToRoot = new List <AutomationElement>();

            while (element != null)
            {
                // Break on circular relationship (should not happen?)
                //if (pathToRoot.Contains(element) || element.Equals(_rootElement)) { break; }
                if (pathToRoot.Contains(element))
                {
                    break;
                }
                try
                {
                    if (element.Parent != null)
                    {
                        pathToRoot.Add(element);
                    }
                    if (element.Parent == null)
                    {
                        root = element;
                    }
                }
                catch (Exception)
                {
                    root = element;
                }
                try
                {
                    //element = _treeWalker.GetParent(element);
                    element = element.Parent;
                }
                catch (Exception ex)
                {
                    Log.Error(ex, "");
                    return;
                }
            }
            Log.Selector(string.Format("windowsselector::create pathToRoot::end {0:mm\\:ss\\.fff}", sw.Elapsed));
            pathToRoot.Reverse();
            if (anchor != null)
            {
                var anchorlist = anchor.Where(x => x.Enabled && x.Selector == null).ToList();
                for (var i = 0; i < anchorlist.Count(); i++)
                {
                    if (WindowsSelectorItem.Match(anchorlist[i], pathToRoot[0]))
                    //if (((WindowsSelectorItem)anchorlist[i]).Match(pathToRoot[0]))
                    {
                        pathToRoot.Remove(pathToRoot[0]);
                    }
                    else
                    {
                        Log.Selector("Element does not match the anchor path");
                        return;
                    }
                }
            }

            if (pathToRoot.Count == 0)
            {
                Log.Error("Element is same as annchor");
                return;
            }
            baseElement = pathToRoot.First();
            element     = pathToRoot.Last();
            Clear();
            Log.Selector(string.Format("windowsselector::remove anchor if needed::end {0:mm\\:ss\\.fff}", sw.Elapsed));
            WindowsSelectorItem item;

            if (anchor == null)
            {
                item         = new WindowsSelectorItem(baseElement, true);
                item.Enabled = true;
                //item.canDisable = false;
                Items.Add(item);
            }
            for (var i = 0; i < pathToRoot.Count(); i++)
            {
                var o = pathToRoot[i];
                item = new WindowsSelectorItem(o, false);
                if (i == 0 || i == (pathToRoot.Count() - 1))
                {
                    item.canDisable = false;
                }
                foreach (var p in item.Properties) // TODO: Ugly, ugly inzuBiz hack !!!!
                {
                    int idx = p.Value.IndexOf(".");
                    if (p.Name == "ClassName" && idx > -1)
                    {
                        int idx2 = p.Value.IndexOf(".", idx + 1);
                        if (idx2 > idx)
                        {
                            p.Value = p.Value.Substring(0, idx2 + 1) + "*";
                        }
                    }
                    //if (p.Name == "ClassName" && p.Value.StartsWith("WindowsForms10")) p.Value = "WindowsForms10*";
                    if (p.Name == "ClassName" && p.Value.ToLower() == "shelldll_defview")
                    {
                        item.Enabled = false;
                    }
                }
                if (doEnum)
                {
                    item.EnumNeededProperties(o, o.Parent);
                }
                Items.Add(item);
            }
            pathToRoot.Reverse();
            Log.Selector(string.Format("windowsselector::EnumNeededProperties::end {0:mm\\:ss\\.fff}", sw.Elapsed));
            OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("Count"));
            OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("Item[]"));
            OnCollectionChanged(new System.Collections.Specialized.NotifyCollectionChangedEventArgs(System.Collections.Specialized.NotifyCollectionChangedAction.Reset));
        }
 private void OnMouseUp(InputEventArgs e)
 {
     try
     {
         if (e.Element == null)
         {
             return;
         }
         if (Entity == null || string.IsNullOrEmpty(Selector))
         {
             return;
         }
         var pathToRoot            = new List <AutomationElement>();
         AutomationElement element = e.Element.RawElement;
         while (element != null)
         {
             if (pathToRoot.Contains(element))
             {
                 break;
             }
             try
             {
                 if (element.Parent != null)
                 {
                     pathToRoot.Add(element);
                 }
             }
             catch (Exception)
             {
             }
             try
             {
                 element = element.Parent;
             }
             catch (Exception ex)
             {
                 element = null;
                 Log.Error(ex, "");
                 // return;
             }
         }
         WindowsSelector selector = new WindowsSelector(Selector);
         if (pathToRoot.Count < (selector.Count - 1))
         {
             return;
         }
         if (pathToRoot.Count > (selector.Count - 1))
         {
             return;
         }
         pathToRoot.Reverse();
         for (var i = 0; i < pathToRoot.Count; i++)
         {
             element = pathToRoot[i];
             WindowsSelectorItem s = new WindowsSelectorItem(selector[(i + 1)]);
             if (!s.Match(element))
             {
                 Log.Verbose("WindowsClickDetectorPlugin: Element " + i + " does not match with selector");
                 return;
             }
         }
         var _e = new DetectorEvent(e.Element);
         OnDetector?.Invoke(this, _e, EventArgs.Empty);
     }
     catch (Exception ex)
     {
         Log.Error(ex.ToString());
     }
 }
示例#8
0
        public static UIElement[] GetElementsWithuiSelector(WindowsSelector selector, IElement fromElement, int maxresults, WindowsCacheExtension ext)
        {
            TimeSpan timeout = TimeSpan.FromMilliseconds(5000);

            timeout = TimeSpan.FromMilliseconds(20000);
            var sw = new System.Diagnostics.Stopwatch();

            sw.Start();
            Log.Selector(string.Format("GetElementsWithuiSelector::begin {0:mm\\:ss\\.fff}", sw.Elapsed));

            UIElement _fromElement = fromElement as UIElement;
            // var selectors = selector.Where(x => x.Enabled == true && x.Selector == null).ToList();
            var selectors = selector.ToList();
            AutomationElement startfrom = null;

            if (_fromElement != null)
            {
                startfrom = _fromElement.RawElement;
            }


            var _current = new List <UIElement>();
            // var automation = AutomationUtil.getAutomation();
            AutomationBase automation = null;

            if (ext != null)
            {
                automation = ext.automation;
            }
            if (automation == null)
            {
                automation = AutomationUtil.getAutomation();
            }

            UIElement[] result = null;
            // AutomationElement ele = null;

            bool search_descendants = selectors[0].SearchDescendants();

            if (startfrom == null)
            {
                startfrom = automation.GetDesktop();
            }
            _current.Add(new UIElement(startfrom));
            for (var i = 0; i < selectors.Count; i++)
            {
                var _sel    = selectors[i];
                var sel     = new WindowsSelectorItem(_sel);
                var current = _current.ToArray();
                _current.Clear();
                // if(i == 1 && current.Length == 1 && current.First().ControlType == sel.ControlType)
                if (i == 1)
                {
                    foreach (var e in current)
                    {
                        if (WindowsSelectorItem.Match(sel, e.RawElement))
                        {
                            _current.Add(e);
                        }
                    }
                    if (_current.Count > 0)
                    {
                        continue;
                    }
                    //_current = GetElementsWithuiSelectorItem(automation, sel, current, maxresults, i == (selectors.Count - 1)).ToList();
                    //if(_current.Count == 0) _current = current.ToList();
                    //_current = current.ToList();
                }
                _current = GetElementsWithuiSelectorItem(i, automation, sel, current, maxresults, i == (selectors.Count - 1), search_descendants).ToList();
                if (i == 0 && _current.Count == 0)
                {
                    _current = current.ToList();
                }
                else if (i > 0 && _current.Count == 0 && current.Length > 0 && (PluginConfig.try_mouse_over_search || selector.mouse_over_search()))
                {
                    for (var z = 0; z < current.Length; z++)
                    {
                        current[z].Focus();
                        var x = current[z].Rectangle.X + 5; var y = current[z].Rectangle.Y + 5;
                        var screen = automation.FromPoint(new System.Drawing.Point(x, y));
                        Log.Selector("mouse point lookup at " + x + "," + y + " for " + sel.ToString());
                        var screenel = screen.Parent;
                        while (screenel != null)
                        {
                            var uiscreenel = new UIElement(screenel);

                            if (WindowsSelectorItem.Match(sel, screenel))
                            {
                                _current.Clear();
                                _current.Add(new UIElement(screenel));
                                Log.Selector("Mouse lookup found " + uiscreenel.ToString());
                                break;
                            }
                            else
                            {
                                screenel = screenel.Parent;
                            }
                            // only allow direct parents, or search for match in all child elements found ? ( like searching for a button inside a pane )
                            //else
                            //{
                            //    Log.Output("Lookup in " + uiscreenel.ToString());
                            //    _current = GetElementsWithuiSelectorItem(i, automation, sel, new UIElement[] { uiscreenel }, maxresults, i == (selectors.Count - 1), search_descendants).ToList();
                            //    if (_current.Count != 0) break;
                            //    screenel = screenel.Parent;
                            //}
                        }
                        if (_current.Count > 0)
                        {
                            break;
                        }
                    }
                }
            }
            Log.Debug(string.Format("GetElementsWithuiSelector::completed with " + _current.Count + " results {0:mm\\:ss\\.fff}", sw.Elapsed));
            if (_current.Count > 0)
            {
                result = _current.ToArray();
                if (result.Count() > maxresults)
                {
                    Console.WriteLine("found " + result.Count() + " but only needed " + maxresults);
                    result = result.Take(maxresults).ToArray();
                }
                return(result);
            }
            if (result == null)
            {
                Log.Selector(string.Format("GetElementsWithuiSelector::ended with 0 results after {0:mm\\:ss\\.fff}", sw.Elapsed));
                return(new UIElement[] { });
            }
            if (result.Count() > maxresults)
            {
                result = result.Take(maxresults).ToArray();
            }
            Log.Selector(string.Format("GetElementsWithuiSelector::ended with " + result.Length + " results after {0:mm\\:ss\\.fff}", sw.Elapsed));
            return(result);
        }
示例#9
0
        public WindowsSelector(AutomationElement element, WindowsSelector anchor, bool doEnum)
        {
            var sw = new System.Diagnostics.Stopwatch();

            sw.Start();
            Log.Selector(string.Format("windowsselector::begin {0:mm\\:ss\\.fff}", sw.Elapsed));

            AutomationElement root        = null;
            AutomationElement baseElement = null;
            var pathToRoot = new List <AutomationElement>();

            while (element != null)
            {
                // Break on circular relationship (should not happen?)
                //if (pathToRoot.Contains(element) || element.Equals(_rootElement)) { break; }
                // if (pathToRoot.Contains(element)) { break; }
                try
                {
                    if (element.Parent != null)
                    {
                        pathToRoot.Add(element);
                    }
                    if (element.Parent == null)
                    {
                        root = element;
                    }
                }
                catch (Exception)
                {
                    root = element;
                }
                try
                {
                    //element = _treeWalker.GetParent(element);
                    element = element.Parent;
                }
                catch (Exception ex)
                {
                    Log.Error(ex, "");
                    return;
                }
            }
            Log.Selector(string.Format("windowsselector::create pathToRoot::end {0:mm\\:ss\\.fff}", sw.Elapsed));
            pathToRoot.Reverse();
            if (anchor != null)
            {
                var anchorlist = anchor.Where(x => x.Enabled && x.Selector == null).ToList();
                for (var i = 0; i < anchorlist.Count(); i++)
                {
                    if (WindowsSelectorItem.Match(anchorlist[i], pathToRoot[0]))
                    //if (((WindowsSelectorItem)anchorlist[i]).Match(pathToRoot[0]))
                    {
                        pathToRoot.Remove(pathToRoot[0]);
                    }
                    else
                    {
                        Log.Selector("Element does not match the anchor path");
                        return;
                    }
                }
            }
            WindowsSelectorItem item;
            var temppathToRoot = new List <AutomationElement>();
            var newpathToRoot  = new List <AutomationElement>();

            foreach (var e in pathToRoot)
            {
                temppathToRoot.Add(e);
            }
            Log.Selector(string.Format("windowsselector::traverse back to element from root::begin {0:mm\\:ss\\.fff}", sw.Elapsed));
            using (var automation = AutomationUtil.getAutomation())
            {
                var  _treeWalker = automation.TreeWalkerFactory.GetControlViewWalker();
                bool isDesktop   = true;
                var  parent      = automation.GetDesktop();
                if (anchor != null)
                {
                    parent = temppathToRoot[0].Parent; isDesktop = false;
                }
                while (temppathToRoot.Count > 0)
                {
                    var i = temppathToRoot.First();
                    temppathToRoot.Remove(i);
                    item = new WindowsSelectorItem(i, false);
                    var m = item.matches(automation, parent, _treeWalker, 2, isDesktop);
                    if (m.Length > 0)
                    {
                        newpathToRoot.Add(i);
                        parent    = i;
                        isDesktop = false;
                    }
                    if (m.Length == 0 && Config.local.log_selector)
                    {
                        var message  = "needed to find " + Environment.NewLine + item.ToString() + Environment.NewLine + "but found only: " + Environment.NewLine;
                        var children = parent.FindAllChildren();
                        foreach (var c in children)
                        {
                            try
                            {
                                message += new UIElement(c).ToString() + Environment.NewLine;
                            }
                            catch (Exception)
                            {
                            }
                        }
                        Log.Debug(message);
                        //if (i.Parent != null)
                        //{
                        //    var c = i.Parent.FindAllChildren();
                        //    var IndexInParent = -1;
                        //    for (var x = 0; x < c.Count(); x++)
                        //    {
                        //        if (i == c[x]) IndexInParent = x;
                        //    }
                        //}
                    }
                }
            }
            Log.Selector(string.Format("windowsselector::traverse back to element from root::end {0:mm\\:ss\\.fff}", sw.Elapsed));
            if (newpathToRoot.Count != pathToRoot.Count)
            {
                Log.Information("Selector had " + pathToRoot.Count + " items to root, but traversing children inly matched " + newpathToRoot.Count);
                pathToRoot = newpathToRoot;
            }



            if (pathToRoot.Count == 0)
            {
                Log.Error("Element has not parent, or is same as annchor");
                return;
            }
            baseElement = pathToRoot.First();
            element     = pathToRoot.Last();
            Clear();
            Log.Selector(string.Format("windowsselector::remove anchor if needed::end {0:mm\\:ss\\.fff}", sw.Elapsed));
            if (anchor == null)
            {
                item         = new WindowsSelectorItem(baseElement, true);
                item.Enabled = true;
                //item.canDisable = false;
                Items.Add(item);
            }
            bool isStartmenu = false;

            for (var i = 0; i < pathToRoot.Count(); i++)
            {
                var o = pathToRoot[i];
                item = new WindowsSelectorItem(o, false);
                if (i == 0 || i == (pathToRoot.Count() - 1))
                {
                    item.canDisable = false;
                }
                foreach (var p in item.Properties) // TODO: Ugly, ugly inzuBiz hack !!!!
                {
                    int idx = p.Value.IndexOf(".");
                    if (p.Name == "ClassName" && idx > -1)
                    {
                        int idx2 = p.Value.IndexOf(".", idx + 1);
                        if (idx2 > idx)
                        {
                            p.Value = p.Value.Substring(0, idx2 + 1) + "*";
                        }
                    }
                    //if (p.Name == "ClassName" && p.Value.StartsWith("WindowsForms10")) p.Value = "WindowsForms10*";
                    if (p.Name == "ClassName" && p.Value.ToLower() == "shelldll_defview")
                    {
                        item.Enabled = false;
                    }
                    if (p.Name == "ClassName" && (p.Value.ToLower() == "dv2vontrolhost" || p.Value.ToLower() == "desktopprogramsmfu"))
                    {
                        isStartmenu = true;
                    }
                    if (p.Name == "ClassName" && p.Value == "#32770")
                    {
                        item.Enabled = false;
                    }
                    if (p.Name == "ControlType" && p.Value == "ListItem" && isStartmenu)
                    {
                        p.Enabled = false;
                    }
                }
                var hassyslistview32 = item.Properties.Where(p => p.Name == "ClassName" && p.Value.ToLower() == "syslistview32").ToList();
                if (hassyslistview32.Count > 0)
                {
                    var hasControlType = item.Properties.Where(p => p.Name == "ControlType").ToList();
                    if (hasControlType.Count > 0)
                    {
                        hasControlType[0].Enabled = false;
                    }
                }

                if (doEnum)
                {
                    item.EnumNeededProperties(o, o.Parent);
                }
                Items.Add(item);
            }
            pathToRoot.Reverse();
            Log.Selector(string.Format("windowsselector::end {0:mm\\:ss\\.fff}", sw.Elapsed));
            OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("Count"));
            OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("Item[]"));
            OnCollectionChanged(new System.Collections.Specialized.NotifyCollectionChangedEventArgs(System.Collections.Specialized.NotifyCollectionChangedAction.Reset));
        }